/// ノード生成する. 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); }
/// ノード生成する. 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); }
/// ノード生成する. 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; }
//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)); }
/// <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; }