Esempio n. 1
0
 /// <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);
     }
 }
Esempio n. 2
0
    /// <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;
            }
        }
    }