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