【问题标题】:sprite will only move to my first waypoint精灵只会移动到我的第一个航点
【发布时间】:2020-06-08 21:19:45
【问题描述】:

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

Inspector for the road object that contains all the waypoints

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
            }
        }
    }
}

【问题讨论】:

  • 精灵和航点的Z轴值是否相同?

标签: c# unity3d


【解决方案1】:

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

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 函数中计算这些值,也可以在到达下一个航点时计算这些值。

希望这会有所帮助!

【讨论】:

  • 为什么是0.2?该范围可能非常大,具体取决于应用程序...您可以使用 Mathf.Epsilon 或转换使用 0.00001if((Vector2)gameObject.transform.position == (Vector2)endPosition)
  • 它不一定是 0.2,你可以根据自己的游戏将值更改为任何值。关键是gameObject和航点的位置可能完全不一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多