在路口等待统一C#的时间

时间:2019-09-26 09:31:18

标签: c# unity3d coroutine

我在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);
}

}

3 个答案:

答案 0 :(得分:2)

您可以使用simble bool标志来知道是否应该移动。在“移动(或更新)”中,检查该布尔值以了解是否应该移动。

在WaitAtPoint中,将bool(如shouldWait)设置为true,然后在WaitForSecond之后将其设置为false!

答案 1 :(得分:2)

好吧,您的WaitAtPoint目前做得并不好。这是因为它正在IEnumerator中等待,而不是在您调用它的位置。

有多种方法可以解决此问题,但是我建议在您的IEnumerator上使用callback,该时间将在等待时间之后执行。

赞:

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

答案 2 :(得分:2)

您正在调用Move每一次更新,您也可能多次调用StartCoroutine,所以我建议使用变量来查看您是否应该更新机芯

comparingByValue

}