Реализовываю вот алгоритм поиска пути для ИИ с использованием узлов.
У каждого узла есть свой ID.
Юнит должен получить массив int[], где будут ID узлов, которые он должен пройти.
Вот код, с которым у меня проблема
Синтаксис:
Используется csharp
public int[] Way(int Start, int End)
{
//Все объекты узлов
GameObject[] AllNodesObjects = GameObject.FindGameObjectsWithTag("Node");
// неотсортированный список узлов
Node[] AllNodes = new Node[AllNodesObjects.Length];
// заполняем список!
for(int i = 0; i < AllNodesObjects.Length; i++)
{
AllNodes[i] = AllNodesObjects[i].GetComponent<Node>();
}
//отсортированный список
Node[] Nodes = new Node[AllNodes.Length];
//Сортировка
for(int i = 0; i < AllNodes.Length; i++)
{
Nodes[AllNodes[i].ID] = AllNodes[i];
}
//Мы получили отсортированный массив узлов. начинаем поиск пути.
if(Nodes[End].gameObject.GetComponent<EndNode>() == null)
{
Nodes[Start].IsChecked = true;
Nodes[Start].CheckNearest();
EndNode EN = Nodes[End].gameObject.AddComponent<EndNode>();
if(!Stop)
{
if(EN.EndFind)
{
return EN.Way;
}
}
else
{
return nullArr;
}
}
else
{
return nullArr;
}
}
IEnumerator WaitForStopFind()
{
yield return new WaitForSeconds(10f);
Stop = true;
}
{
//Все объекты узлов
GameObject[] AllNodesObjects = GameObject.FindGameObjectsWithTag("Node");
// неотсортированный список узлов
Node[] AllNodes = new Node[AllNodesObjects.Length];
// заполняем список!
for(int i = 0; i < AllNodesObjects.Length; i++)
{
AllNodes[i] = AllNodesObjects[i].GetComponent<Node>();
}
//отсортированный список
Node[] Nodes = new Node[AllNodes.Length];
//Сортировка
for(int i = 0; i < AllNodes.Length; i++)
{
Nodes[AllNodes[i].ID] = AllNodes[i];
}
//Мы получили отсортированный массив узлов. начинаем поиск пути.
if(Nodes[End].gameObject.GetComponent<EndNode>() == null)
{
Nodes[Start].IsChecked = true;
Nodes[Start].CheckNearest();
EndNode EN = Nodes[End].gameObject.AddComponent<EndNode>();
if(!Stop)
{
if(EN.EndFind)
{
return EN.Way;
}
}
else
{
return nullArr;
}
}
else
{
return nullArr;
}
}
IEnumerator WaitForStopFind()
{
yield return new WaitForSeconds(10f);
Stop = true;
}
Проблема в том, что поиск пути будет идти несколько кадров, а этот метод должен вернуть всё за один кадр.
Я понимаю, что нужно использовать корутины, но понятия не имею, как...