首页 > 解决方案 > 在统一C#中等待航路点的时间量

问题描述

我在 Unity 2D 项目中有一个航点系统,其中 GameObject 将按顺序跟随每个航点,然后重复该过程,我希望 GameObject 在每个点停止一段固定的时间,我想我可以使用协程但不完全确定如何实现这一点,到目前为止我所做的是创建一个名为 WaitAtPoint 的协程,然后在每个航路点移动时调用它,但无济于事,不确定我做错了什么。

public class BrainBoss : MonoBehaviour {
[SerializeField]
Transform[] waypoints;

[SerializeField]
float moveSpeed = 2f;

int waypointIndex = 0;


// Start is called before the first frame update
void Start()
{
    transform.position = waypoints[waypointIndex].transform.position;
}

// Update is called once per frame
void Update()
{
    Move();
}

void Move()
{
    transform.position = Vector2.MoveTowards(transform.position, 
        waypoints[waypointIndex].transform.position, moveSpeed * Time.deltaTime);

    if(transform.position == waypoints[waypointIndex].transform.position)
    {
        StartCoroutine(WaitAtPoint());
        waypointIndex += 1;
    }

    if(waypointIndex == waypoints.Length)
    {
        waypointIndex = 1;
    }
}

IEnumerator WaitAtPoint()
{
    yield return new WaitForSeconds(3f);
}

}

标签: c#unity3dcoroutine

解决方案


好吧,你WaitAtPoint目前并没有做很多事情。这是因为它在 IEnumerator 内部等待,而不是在您调用它的位置。

有多种方法可以解决这个问题,但我建议callback在等待时间后执行的 IEnumerator 上使用。

像这样:

private bool isWaiting;

void Update() {
    if (!isWaiting) {
        Move();
    }
}

void Move()
{
    transform.position = Vector2.MoveTowards(transform.position, 
        waypoints[waypointIndex].transform.position, moveSpeed * Time.deltaTime);

    if(transform.position == waypoints[waypointIndex].transform.position)
    {
        StartCoroutine(WaitAtPoint(() => 
        {
            // All code that should be executed after waiting here.
            waypointIndex += 1;
        }));

    }

    if(waypointIndex == waypoints.Length)
    {
        waypointIndex = 1;
    }
}

IEnumerator WaitAtPoint(Action callback)
{
    isWaiting = true;
    yield return new WaitForSeconds(3f);
    callback.Invoke();
    isWaiting = false;
}

推荐阅读