public static ArrayList FindPath(Node startNode, Node endNode) { int findCount = 0; // 탐색을 위한 Node를 담을 Queue 설정 openQueue = new SortingQueue <Node>(); openQueue.Enqueue(startNode); startNode.gScore = 0f; startNode.hScore = GetPostionScore(startNode, endNode); //탐색이 끝난 Node를 담을 Queue 설정, 자기가 있는 중심축 closedQueue = new SortingQueue <Node>(); Node node = null; while (openQueue.Count != 0) { //Queue는 먼저 들어간게 먼저 나온다. node = openQueue.Dequeue(); // 목적지를 찾았다면 if (node == endNode) { Debug.Log("Find: " + findCount); return(GetReverseResult(node)); } // Node를 기준으로 갈수있는 주변 길 찾기 ArrayList availableNodes = GameController.Instance.GetAvailableNodes(node); foreach (Node availableNode in availableNodes) { //이미 찾았던 길이 아니라면 openQueue에 추가 if (!closedQueue.Contains(availableNode)) { //다른애가 오픈큐에 넣었었는데 다시 똑같은 길을 찾아서 오픈큐에 넣으려는 중복을 방지하도록 처리 if (openQueue.Contains(availableNode)) { float score = GetPostionScore(node, availableNode); float newGScore = node.gScore + score; //더 가까운 길이라면 if (availableNode.gScore > newGScore) { availableNode.gScore = newGScore; availableNode.parent = node; } } else { float score = GetPostionScore(node, availableNode); float newGScore = node.gScore + score; float newHScore = GetPostionScore(availableNode, endNode); availableNode.gScore = newGScore; availableNode.hScore = newHScore; //GScore에 따라 부모가 바뀜 availableNode.parent = node; openQueue.Enqueue(availableNode); findCount++; } } } closedQueue.Enqueue(node); } if (node == endNode) { Debug.Log("Find: " + findCount); return(GetReverseResult(node)); } return(null); }
public static ArrayList FindPath(Node startNode, Node endNode) { int findCount = 0; // 탐색을 위한 Node를 담을 Queue 설정 openQueue = new SortingQueue <Node>(); openQueue.Enqueue(startNode); startNode.gScore = 0f; startNode.hScore = GetPostionScore(startNode, endNode); // 탐색이 끝난 Node를 담을 Queue 설정 closedQueue = new SortingQueue <Node>(); Node node = null; while (openQueue.Count != 0) { node = openQueue.Dequeue(); // 목적지를 찾았다면 if (node == endNode) { Debug.Log("Find: " + findCount); return(GetReverseResult(node)); } // Node를 기준으로 갈수있는 주변 길 찾기 ArrayList availableNodes = GameController.Instance.GetAvailableNodes(node); foreach (Node availableNode in availableNodes) { if (!closedQueue.Contains(availableNode)) { if (openQueue.Contains(availableNode)) { float score = GetPostionScore(node, availableNode); float newGScore = node.gScore + score; if (availableNode.gScore > newGScore) { availableNode.gScore = newGScore; availableNode.parent = node; } } else { float score = GetPostionScore(node, availableNode); float newGScore = node.gScore + score; float newHScore = GetPostionScore(availableNode, endNode); availableNode.gScore = newGScore; availableNode.hScore = newHScore; availableNode.parent = node; openQueue.Enqueue(availableNode); findCount++; } } } closedQueue.Enqueue(node); } if (node == endNode) { Debug.Log("Find: " + findCount); return(GetReverseResult(node)); } return(null); }