首页 > 解决方案 > 精灵只会移动到我的第一个航点

问题描述

我试图让一个精灵在生成后沿着一组航路点移动,但每当精灵到达第一个航路点时,它就会停止。

包含所有航点的道路对象的检查器

public class MoveEnemy : MonoBehaviour
{

    [HideInInspector]
    public GameObject[] waypoints;
    private int currentWaypoint = 0;
    private float lastWaypointSwitchTime;
    public float speed = 1.0f;

    // Start is called before the first frame update
    void Start()
    {
        lastWaypointSwitchTime = Time.time;
    }

    // Update is called once per frame
    void Update()
    {
        // 1 
        Vector3 startPosition = waypoints[currentWaypoint].transform.position;
        Vector3 endPosition = waypoints[currentWaypoint + 1].transform.position;
        // 2 
        float pathLength = Vector3.Distance(startPosition, endPosition);
        float totalTimeForPath = pathLength / speed;
        float currentTimeOnPath = Time.time - lastWaypointSwitchTime;
        gameObject.transform.position = Vector2.Lerp(startPosition, endPosition, currentTimeOnPath / totalTimeForPath);
        // 3 
        if (gameObject.transform.position.Equals(endPosition))
        {
            if (currentWaypoint < waypoints.Length - 2)
            {
                // 3.a 
                currentWaypoint++;
                lastWaypointSwitchTime = Time.time;
                // TODO: Rotate into move direction
            }
            else
            {
                // 3.b 
                Destroy(gameObject);

                AudioSource audioSource = gameObject.GetComponent<AudioSource>();
                AudioSource.PlayClipAtPoint(audioSource.clip, transform.position);
                // TODO: deduct health
            }
        }
    }
}

标签: c#unity3d

解决方案


要解决您的问题,请尝试更换

if (gameObject.transform.position.Equals(endPosition))

if (Vector2.Distance(gameObject.transform.position, endPosition) < 0.2f)

这应该可以解决游戏对象在第一个航路点停止的问题。这是因为游戏对象和路点的位置可能在小数点后不一样,所以这段代码会检查它是否在距离下一个路点的 0.2 范围内。

也调用这两行:

Vector3 startPosition = waypoints[currentWaypoint].transform.position;
Vector3 endPosition = waypoints[currentWaypoint + 1].transform.position;

在更新功能不是很有效。您可以在 start 函数中计算这些值,也可以在到达下一个航点时计算这些值。

希望这可以帮助!


推荐阅读