Помните, что Corutine работает аналогично потоку (асинхронное выполнение).
Обратите внимание, что, поскольку @akaBase указывает на комментарии, проблема заключается в том, что вы оцениваете nodeStat сразу после вызова Coroutine, вы не ждете сопрограмма к fini sh.
Таким образом, вы отправляете несколько асинхронных вызовов (по одному для каждого узла), но не ожидаете их всех.
Одним из подходов может быть добавление событие / делегат / действие до вашего перерыва в Recursive, где вы сохраняете результат одного узла, а затем оцениваете на другом сопрограмме (который должен быть вашим текущим исполнением), что, если какой-то делегат ложен, результат ложен.
Что-то вроде:
private List<bool> nodeExecutionResultsList = new List<bool>();
private Status statusResult = Status.Failure;
private Action OnAllNodesEnd = null;
protected override void Execute()
{
OnAllNodesEnd = () => { Debug.Log("Every Node Ends!"); };
foreach (Node nod in ListaNoduri)
{
GameManager.Instance.StartCoroutine(Recursive(nod));
}
}
IEnumerator Recursive(Node nod)
{
while (true)
{
Debug.Log(nod + "is running");
Status status = nod.Tick();
Debug.Log(Time.time + " " + status);
if (status == Status.Running)
{
Debug.Log("start coroutine at : " + Time.time);
yield return new WaitForSeconds(0.2f);
Debug.Log("Comtinue coroutine at : " + Time.time);
}
else
{
Debug.Log("has finished coroutine");
nodeStat = status;
//Do the assert NOW, and register on the list the result
Debug.Assert(nodeStat != Status.None);
nodeExecutionResult.Add(nodeStat == Status.Failure);
break;
}
}
}
private IEnumerator EvaluateAllNodes()
{
while(evaluating)
{
//there are the same number of results as nodes
if(nodeExecutionResultsList.Count == ListaNoduri.Count)
{
//check if someone fails
statusResult = (nodeExecutionResult.Contains(false)) ? Status.Failure : Status.Success;
}
}
OnAllNodesEnd?.Invoke();
}