脚本附加到两个游戏对象.
一个是碰撞区域,碰撞器足够大,因此当游戏开始时,玩家已经在碰撞区域内,然后当他离开该区域时,一切都正常.
问题是,当我用collider将对象附加到另一个游戏对象上时,但这次collider变小了,他在更大的collider内,所以现在玩家正在进入更小的collider,而不是第一次退出.但我想在这两种情况下产生相同的效果.
如果玩家退出对撞机,他会减速等待,然后转身,向后移动.
两个对撞机区域的屏幕截图.左边的小棋子是玩家先入后出的棋子.当玩家在更大的对撞机区域时,游戏开始.
还有 playbook :
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UnityStandardAssets.Characters.ThirdPerson;
public class DistanceCheck : MonoBehaviour
{
public Transform targetToRotateTowards;
public Transform colliderArea;
public float lerpDuration;
public float rotationSpeed;
[TextArea(1, 2)]
public string textToShow;
public GameObject descriptionTextImage;
public TextMeshProUGUI text;
public ThirdPersonUserControl thirdPersonUserControl;
private Animator anim;
private float timeElapsed = 0;
private float startValue = 1;
private float endValue = 0;
private float valueToLerp = 0;
private bool startRotating = false;
private bool slowOnBack = true;
private bool exited = false;
private Vector3 exitPosition;
private float distance;
void Start()
{
anim = transform.GetComponent<Animator>();
}
private void FixedUpdate()
{
if (startRotating)
{
transform.rotation = Quaternion.RotateTowards(transform.rotation,
Quaternion.LookRotation(targetToRotateTowards.position - transform.position),
rotationSpeed * Time.deltaTime);
}
if (exitPosition != new Vector3(0, 0, 0) && slowOnBack)
{
distance = Vector3.Distance(transform.position, exitPosition);
}
if (distance > 5 && slowOnBack)
{
slowOnBack = false;
StartCoroutine(SlowDown());
}
}
private void OnTriggerExit(Collider other)
{
if (other.name == colliderArea.name)
{
exited = true;
slowOnBack = true;
exitPosition = transform.position;
thirdPersonUserControl.enabled = false;
descriptionTextImage.SetActive(true);
text.text = textToShow;
StartCoroutine(SlowDown());
}
}
private void OnTriggerEnter(Collider other)
{
if (other.name == colliderArea.name)
{
exited = false;
startRotating = false;
text.text = "";
descriptionTextImage.SetActive(false);
}
}
IEnumerator SlowDown()
{
timeElapsed = 0;
while (timeElapsed < lerpDuration)
{
valueToLerp = Mathf.Lerp(startValue, endValue, timeElapsed / lerpDuration);
anim.SetFloat("Forward", valueToLerp);
timeElapsed += Time.deltaTime;
yield return null;
}
if (exited)
{
yield return new WaitForSeconds(3f);
startRotating = true;
StartCoroutine(SpeedUp());
}
if (slowOnBack == false)
{
thirdPersonUserControl.enabled = true;
}
}
IEnumerator SpeedUp()
{
timeElapsed = 0;
while (timeElapsed < lerpDuration)
{
valueToLerp = Mathf.Lerp(endValue, startValue, timeElapsed / lerpDuration);
anim.SetFloat("Forward", valueToLerp);
timeElapsed += Time.deltaTime;
yield return null;
}
}
}
我现在面临两个问题:
-
较小的碰撞器,玩家先输入后退出,较大的碰撞器,玩家先退出后进入,所以我需要以某种方式更改脚本中的
OnTriggerExit/Enter
行为逻辑.但是,如何作出逻辑? -
也许最好将脚本设置为仅在播放器对象上,并使其具有一定的通用性,以便我可以拖动到多个碰撞器,并在每个碰撞器中产生效果.问题是如何 for each 碰撞器区域创建文本字段?现在,因为我将脚本附加到每个碰撞器对象,所以我有一个
colliderArea
变量,但如果我想使脚本仅附加到播放器,我需要将colliderArea
变量更改为List<Transform> collidersAreas
,然后如何为列表中的每个碰撞器区域创建文本字段/区域?