Example #1
0
        /// ノード生成する.
        public ANode GetNode(Vector2Int pos)
        {
            var idx = pos.x + StageCtl.TileLenX * pos.y;             // 一元ID作成

            if (_pool.ContainsKey(idx))
            {
                // 既に存在しているのでプーリングから取得.
                return(_pool[idx]);
            }

            // ないので新規作成.
            var node = new ANode(pos.x, pos.y);

            _pool[idx] = node;
            // ヒューリスティック・コストを計算する.
            node.CalcHeuristic(_allowdiag, _goalPos);
            return(node);
        }
Example #2
0
        /// ノード生成する.
        public ANode GetNode(int x, int y)
        {
            var idx = _layer.ToIdx(x, y);

            if (_pool.ContainsKey(idx))
            {
                // 既に存在しているのでプーリングから取得.
                return(_pool[idx]);
            }

            // ないので新規作成.
            var node = new ANode(x, y);

            _pool[idx] = node;
            // ヒューリスティック・コストを計算する.
            node.CalcHeuristic(_allowdiag, _xgoal, _ygoal);
            return(node);
        }
Example #3
0
        /// ノード生成する.
        public ANode GetNode(int x, int y)
        {
            var idx = _layer.ToIdx(x, y);
            if(_pool.ContainsKey(idx)) {
                // 既に存在しているのでプーリングから取得.
                return _pool[idx];
            }

            // ないので新規作成.
            var node = new ANode(x, y);
            _pool[idx] = node;
            // ヒューリスティック・コストを計算する.
            node.CalcHeuristic(_allowdiag, _xgoal, _ygoal);
            return node;
        }
Example #4
0
    //A-Sterによる経路取得(コルーチン)
    IEnumerator getRouteCo(Vector2Int startPos, Vector2Int goalPos, TileObj[,] tileMap, int unitType, Action <List <Vector2Int>, int> callback, List <Vector2Int> Olist, List <Vector2Int> Alist)
    {
        List <Vector2Int> moveList = new List <Vector2Int>();

        //新規ノード管理
        var mgr = new ANodeMgr(goalPos, tileMap, Olist, Alist, unitType);

        //スタートorゴールが通行不可
        //if (!mgr.CheckNodeAllow(startPos)) {
        //	Debug.Log ("no allow. from("+ startPos +") to("+ goalPos);
        //	if (callback != null) callback(moveList, -1);
        //	yield break;
        //}

        // スタート地点のノード取得
        // スタート地点なのでコストは「0」
        ANode node = mgr.OpenNode(startPos, 0, null);

        mgr.AddOpenList(node);

        // 試行回数。100回超えたら強制中断
        int cnt = 0;

        while (cnt < 100)
        {
            mgr.RemoveOpenList(node);
            // 周囲を開く
            mgr.OpenAround(node);
            // 最小スコアのノードを探す.
            node = mgr.SearchMinScoreNodeFromOpenList();
            if (node == null)
            {
                // 袋小路なのでおしまい.
                node = mgr.SearchMinScoreNodeFromCloseList(goalPos);
                Debug.LogWarning(string.Format("[Not found path.] Min: ({0},{1})", node.X, node.Y));
                //node.DumpRecursive();
                // パスを取得する
                node.GetPath(moveList);
                // 反転する
                moveList.Reverse();
                break;
            }
            if (node.X == goalPos.x && node.Y == goalPos.y)
            {
                // ゴールにたどり着いた.
                //Debug.Log ("Success.");
                mgr.RemoveOpenList(node);
                //node.DumpRecursive();
                // パスを取得する
                node.GetPath(moveList);
                // 反転する
                moveList.Reverse();
                break;
            }
            cnt++;
            yield return(null);           //new WaitForSeconds(0.01f);
        }
        if (cnt == 100)
        {
            // 袋小路なのでおしまい.
            node = mgr.SearchMinScoreNodeFromCloseList(goalPos);
            Debug.LogWarning(string.Format("[Over] Min: ({0},{1})", node.X, node.Y));
            //node.DumpRecursive();
            // パスを取得する
            node.GetPath(moveList);
            // 反転する
            moveList.Reverse();
        }


        if (callback != null)
        {
            callback(moveList, node.CalcHeuristic(false, goalPos));
        }
        yield return(new WaitForSeconds(0.01f));
    }
Example #5
0
        /// <summary>
        /// ノード生成メソッド
        /// <para> ノードを生成する。</para>
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns>作成したノード</returns>
        public ANode GetNode(int x, int y)
        {
            // 座標をインデックスに変換する
            var idx = _layer.ToIdx(x, y);
            if(_nodeList.ContainsKey(idx))
            {
                // インデックスがノードリストに既に存在している場合はそれを返す
                return _nodeList[idx];
            }

            // インデックスがノードリストに存在しない場合は新規で作成し、連想配列に追加する
            var node = new ANode(x, y);
            _nodeList[idx] = node;

            // ノードのヒューリスティック・コストを計算する
            node.CalcHeuristic(_allowdiag, _xgoal, _ygoal);
            return node;
        }