/// パスを取得する public void GetPath(List <Vector2Int> pList) { pList.Add(new Vector2Int(X, Y)); if (_parent != null) { _parent.GetPath(pList); } }
/// パスを取得する public void GetPath(List <Point2> pList) { pList.Add(new Point2(X, Y)); if (_parent != null) { _parent.GetPath(pList); } }
public List <Point2> GetShortestPath(Vector2 start, Vector2 goal, int[,] map, bool allowdiag = false) { List <Point2> ret = new List <Point2>(); Layer2D layer = new Layer2D(); layer.Create(Constant.MAPSIZE, Constant.MAPSIZE); // TODO: 配列メソッドで取得する方法 for (int i = 0; i < Constant.MAPSIZE; i++) { for (int j = 0; j < Constant.MAPSIZE; j++) { layer.Set(j, i, map[i, j]); } } var mgr = new ANodeMgr(layer, (int)goal.x, (int)goal.y, allowdiag); ANode node = mgr.OpenNode((int)start.x, (int)start.y, 0, null); if (node == null) { Debug.Log("node is null start" + start); } int cnt = 0; while (cnt < 1000) { mgr.RemoveOpenList(node); // 周囲を開く mgr.OpenAround(node); // 最小スコアのノードを探す. node = mgr.SearchMinScoreNodeFromOpenList(); if (node == null) { // 袋小路なのでおしまい. // Debug.Log("Not found path."); break; } if (node.X == (int)goal.x && node.Y == (int)goal.y) { // ゴールにたどり着いた. // Debug.Log("Success."); mgr.RemoveOpenList(node); node.DumpRecursive(); // パスを取得する node.GetPath(ret); // 反転する ret.Reverse(); break; } } return(ret); }
List <Point2> CalcPath(Point2 pStart, Point2 pGoal, int[,] map, bool allowdiag) { var pList = new List <Point2> (); var mgr = new ANodeMgr(pGoal.x, pGoal.y, allowdiag); // スタート地点のノード取得 // スタート地点なのでコストは「0」 ANode node = mgr.OpenNode(pStart.x, pStart.y, 0, null, map); mgr.AddOpenList(node); // 試行回数。1000回超えたら強制中断 int cnt = 0; while (cnt < 1000) { mgr.RemoveOpenList(node); // 周囲を開く mgr.OpenAround(node, map); // 最小スコアのノードを探す. node = mgr.SearchMinScoreNodeFromOpenList(); if (node == null) { // 袋小路なのでおしまい. Debug.Log("Not found path."); Destroy(this); break; } if (node.X == pGoal.x && node.Y == pGoal.y) { // ゴールにたどり着いた. Debug.Log("Success."); mgr.RemoveOpenList(node); // パスを取得する node.GetPath(pList); // 反転する pList.Reverse(); break; } } return(pList); }
//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)); }
IEnumerator Start() { // 地形データのロード. var tmx = new TMXLoader(); tmx.Load("Levels/001"); var layer = tmx.GetLayer(0); //layer.Dump(); // タイルの配置. for (int j = 0; j < layer.Height; j++) { for (int i = 0; i < layer.Width; i++) { var v = layer.Get(i, j); var x = GetChipX(i); var y = GetChipY(j); Tile.Add(v, x, y); } } yield return(new WaitForSeconds(0.1f)); var pList = new List <Point2>(); Token player = null; // A-star実行. { // スタート地点. Point2 pStart = GetRandomPosition(layer); player = Util.CreateToken(GetChipX(pStart.x), GetChipY(pStart.y), "", "miku2", "Player"); player.SortingLayer = "Chara"; // ゴール. Point2 pGoal = GetRandomPosition(layer); var goal = Util.CreateToken(GetChipX(pGoal.x), GetChipY(pGoal.y), "", "gate1", "Goal"); goal.SortingLayer = "Chara"; // 斜め移動を許可 var allowdiag = true; var mgr = new ANodeMgr(layer, pGoal.x, pGoal.y, allowdiag); // スタート地点のノード取得 // スタート地点なのでコストは「0」 ANode node = mgr.OpenNode(pStart.x, pStart.y, 0, null); mgr.AddOpenList(node); // 試行回数。1000回超えたら強制中断 int cnt = 0; while (cnt < 1000) { mgr.RemoveOpenList(node); // 周囲を開く mgr.OpenAround(node); // 最小スコアのノードを探す. node = mgr.SearchMinScoreNodeFromOpenList(); if (node == null) { // 袋小路なのでおしまい. Debug.Log("Not found path."); break; } if (node.X == pGoal.x && node.Y == pGoal.y) { // ゴールにたどり着いた. Debug.Log("Success."); mgr.RemoveOpenList(node); node.DumpRecursive(); // パスを取得する node.GetPath(pList); // 反転する pList.Reverse(); break; } yield return(new WaitForSeconds(0.01f)); } } _state = eState.Walk; // プレイヤーを移動させる. foreach (var p in pList) { var x = GetChipX(p.x); var y = GetChipY(p.y); player.X = x; player.Y = y; yield return(new WaitForSeconds(0.2f)); } // おしまい _state = eState.End; }