首页 > 解决方案 > 协程只执行一次

问题描述

我有一个游戏,汽车在路上行驶,路上有触发器。目的是检测汽车何时进入这些触发器并根据触发器执行操作。

对于我遇到问题的那个,相机应该慢慢地移向第二个位置,该位置位于汽车后面并略高于汽车。

这是我尝试过的:

    private void OnTriggerEnter(Collider other)
{


    if (other.attachedRigidbody.velocity.magnitude > 20.0f)
    {
        StartCoroutine(tst());
    }

}
IEnumerator tst()
{
    Camera cam = Camera.main;
    Vector3 newPosition = cam.gameObject.transform.GetChild(0).position;
    cam.transform.position = Vector3.MoveTowards(cam.transform.position, newPosition, camUnit);

    yield return new WaitForSeconds(3);

}

camUnit 等于 1f 但问题是它没有移动到正确的位置,就像我只是将相机分配到与上面代码不同的视角的新位置一样,它是即时的并且移动速度不慢到下一个位置。

我究竟做错了什么?先感谢您。

标签: c#unity3d

解决方案


yield你退出协程之后。根据您的描述,您实际上希望以某种形式的循环,并且yield在完成您需要做的事情之后。然后,在函数恢复后,您决定是再次执行并再次让步,还是继续朝着协程的出口前进。

    bool isDone = false;
    while(!isDone)
    {
        Camera cam = Camera.main;
        Vector3 newPosition = cam.gameObject.transform.GetChild(0).position;
        cam.transform.position = Vector3.MoveTowards(cam.transform.position, newPosition, camUnit);

        yield return new WaitForSeconds(3);
        isDone = EnsureCameraLocation(); // Do whatever check you need to do to figure out if the camera is where you want it yet
    }

请注意,yieldis语句中,while这将使协程无缝。


推荐阅读