/// <summary> /// パスを取得する /// </summary> /// <param name="point_list">移動先の座標を格納するリスト</param> public void GetPath(List <Point2> point_list) { // これはA_NodeのX,Y point_list.Add(new Point2(X, Y)); if (parent != null) { parent.GetPath(point_list); } }
/// <summary> /// 部屋にいるときの移動を管理 /// </summary> public void Stack_List() { // 現在の座標を取得 Point2 start = Get_Now_Position(enemy_object.GetComponent <Enemy>()); // 指定の部屋の入口(出口)を探す Point2 goal = Get_Goal_Position(now_room_number); // 入口(出口)の1つ前の座標を取得 goal_before_one = new List <Point2>(); Get_Goal_Before_One(goal); if (goal_before_one.Count == 0) { Debug.Log("入り口前取れてない"); } // 今いる座標 var start_position = new Vector2Int { x = start.x, y = start.y }; // 今いる部屋の中の座標に置き換える start_position = In_Room_Coodinates(start_position); // 目的地の座標 goal_position = new Vector2Int { x = goal.x, y = goal.y }; // 今いる部屋の中の座標に置き換える goal_position = In_Room_Coodinates(goal_position); // 座標を知ってる構造体のリスト point_list = new List <Point2>(); // 斜め移動を許可 var allowdiag = true; var node_manager = new A_Node_Manager(now_room_number, goal.x, goal.y, goal_before_one, allowdiag); // スタート地点のノード取得 // スタート地点なのでコストは「0」 A_Node node = node_manager.Open_Node((int)start_position.x, (int)start_position.y, 0, null); node_manager.Add_Open_List(node); // 試行回数 int counter = 0; while (counter < 10) //TODO:マジックナンバー { node_manager.Remove_Open_List(node); // 周囲を開く node_manager.Open_Around(node); // 最小スコアのノードを探す. node = node_manager.Search_Min_Score_Node(); if (node == null) { // 袋小路なのでおしまい. break; } // ゴールにたどり着いた // TODO:たどり着かない場合がある。 if (node.X == goal_position.x && node.Y == goal_position.y) { node_manager.Remove_Open_List(node); // パスを取得する node.GetPath(point_list); // 反転する point_list.Reverse(); break; } } }