Unity For C#中的WaitForSeconds只在一次工作

我试图在协程循环中使用两个yield(因为我需要在每个循环之间使用暂停来迭代数组)。

第一个循环能够正常工作,所有的收益率都能在适当的时间内工作。 通过第二个循环,yield返回新的WaitForSeconds()立即开始倒计时,而不是在完成之前等待yield和代码(看来)。 到第三次循环时,时机全部关闭。

我尝试使用while循环而不是for,但得到了相同的结果。

TLDR:我需要在每一个之间暂停我的数组。 如何在协程中通过第一个循环使用多个yield?

public IEnumerator doPathfinding()
{
    for (int i = 0; i < waypoint.Length; i++)
    {

        // get first waypoint from array
        var _waypoint = waypoint[i];

        // get node on A* of cloest waypoint
        closestPointOnNavmesh = AstarPath.active.GetNearest(_waypoint.transform.position, NNConstraint.Default).clampedPosition;

        // Move towards destination
        ai.destination = closestPointOnNavmesh;

        // Wait until within X range of waypoint
        yield return new WaitUntil(() => distanceReached == true);

        // Agent is now at waypoint and automatically stops. Wait 5 seconds before looping to next waypoint.
        yield return new WaitForSeconds(5f);

    }

    Debug.Log("Loop End");
}


    public override void OnUpdate()
    {

        // Get current distance to the target. If distance is less than offset, then sent event.    
        currentDistance = Vector3.Distance(go.transform.position, closestPointOnNavmesh);
        if(currentDistance <= arrivalOffset.Value)
        {
            distanceReached = true;
        }
        else
        {
            distanceReached = false;
        }


    }

在couroutine里面的代码很好,它按预期工作。

根据您所报告的问题,最有可能的是,您同时调用多次协程。

使用bool来检查协程是否已经启动,如下所示:

bool isDoPathFindingRunning = false;
IEnumerator = doPathFinding();

private void Awake() {
    pathFinding = doPathfinding();
}

private void WhereeverYouStartCoroutine() {
    if (!isDoPathFindingRunning)
        StartCoroutine(pathFinding);
}

public IEnumerator doPathfinding() {
    isDoPathFindingRunning = true;
    // Do your stuff
    isDoPathFindingRunning = false;
}
链接地址: http://www.djcxy.com/p/53179.html

上一篇: Unity C# Yield WaitForSeconds within For Loop Only Works Once

下一篇: IEnumerator's yield return null