Я попытался сделать походки BFS на Unity, но я получил недоступную правую и буботочную проблему границы! иду справа или вниз < /strong>, он говорит «вне диапазона!». Проверено _fromto (хранит стрелки длиной в одну плиту для включения пути) , но это выглядит нормально.
Проверено переменные хранения карты как _mapdict, mapdata по случайным 10 плиткам. Найдено правильно. < /li>
переместил 10 случайно выбранных позиций < /strong>, чтобы подтвердить другие позиции в порядке. < /li>
< /ul>
Я попытался сделать походки BFS на Unity, но я получил недоступную правую и буботочную проблему границы! [b] иду справа или вниз < /strong>, он говорит «вне диапазона!». Проверено _fromto (хранит стрелки длиной в одну плиту для включения пути) [/b], но это выглядит нормально. Проверено [b] переменные хранения карты [/b] как _mapdict, mapdata по случайным 10 плиткам. Найдено правильно. < /li> переместил 10 случайно выбранных позиций < /strong>, чтобы подтвердить другие позиции в порядке. < /li> < /ul>
Что мне нужно < /h3>
. Алгоритм Хорошо.[code] public void DisableWalkableTile() { foreach (var go in _walkableOverlays) Destroy(go); foreach (var go in _routeOverlays) Destroy(go); _walkableOverlays.Clear(); _routeOverlays.Clear(); _FromTo.Clear(); }
public List FindRoute(Transform character, CursorDirector cursor) { int safety = 100; // Prevent Infinite Loop Vector3Int start = tilemap.WorldToCell(character.transform.position); Debug.Log($"[MapDirector] Start: {start}"); Vector3Int goal = tilemap.WorldToCell(cursor.transform.position); var route = new List(); // route.Add(start); // 시작점 추가
if (!_FromTo.ContainsKey(goal)) { Debug.Log("사거리 외 지점으로 판단됩니다."); //msg: Out of MoveRange return null; }
Vector3Int current = goal; while (current != start && safety-- > 0) //While Route gets to Start { route.Add(current); Debug.Log($"[MapDirector] Current: {current}"); if (!_FromTo.TryGetValue(current, out current)) { Debug.LogError("루트를 찾는 도중 오류 발생!"); //Path Finding Error Debug.LogError($"current: {current}, start: {start}"); break; } } route.Reverse();
Полный код < /h3> using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Unity.VisualScripting; using UnityEngine; using UnityEngine.Tilemaps;
public abstract class MapDirector_Parent : MonoBehaviour { public class TileInfo { public int MoveCost; public string Name; public string Description; public string Effect; // Still making...
public static TileInfo plane = new TileInfo(1, "평원", "", ""); public static TileInfo water = new TileInfo(100, "물", "진행 불가", ""); public static TileInfo forest = new TileInfo(2, "숲", "방어 + 30", "DEF+30"); public static TileInfo Mountain = new TileInfo(2, "산", "행운 + 30", "LUK+30"); public static TileInfo Rook = new TileInfo(1, "요새", "방어 + 30", "DEF+30"); public static TileInfo Castle = new TileInfo(1, "성", "목표!", ""); public static TileInfo Block = new TileInfo(100, "장애물", "진행 불가", "");
public List MapData = new List(); public Tilemap tilemap; public GameObject walkableTilePrefab; public GameObject routeTilePrefab; public int mapWidth; public int mapHeight;
private Dictionary _mapDict; // [Tile position] = info. private Dictionary _FromTo = new(); //[dest] = start; private List _walkableOverlays = new(); private List _routeOverlays = new(); private static readonly Vector3Int[] _dirs = { new Vector3Int(1, 0, 0), new Vector3Int(-1, 0, 0), new Vector3Int(0, 1, 0), new Vector3Int( 0, -1, 0), };
// Make cache only once private void Awake() { InitializeMapDict(); }
public virtual void Update() { foreach (var kv in _FromTo) { Vector3 from = tilemap.CellToWorld(kv.Value) + new Vector3(0.5f, 0.5f, 0); Vector3 to = tilemap.CellToWorld(kv.Key) + new Vector3(0.5f, 0.5f, 0); Debug.DrawLine(from, to, Color.red); } }
private void InitializeMapDict() { _mapDict = new Dictionary(); BoundsInt bounds = tilemap.cellBounds; for (int x = bounds.xMin; x < bounds.xMax; x++) for (int y = bounds.yMin; y < bounds.yMax; y++) { var pos = new Vector3Int(x, y, 0); var tile = tilemap.GetTile(pos); if (tile == null) continue;
public void DisplayWalkableTile(CharacterDirector character) { _FromTo.Clear(); // Clear Previous Path // 1) Delete Previous Path Tile DisableWalkableTile(); // 2) Start point and MoveRange Vector3Int start = tilemap.WorldToCell(character.transform.position - new Vector3(0.5f, 0f, 0f)); int maxCost = character.MoveRange;
// 3) BFS Queue Variable Setting var costSoFar = new Dictionary { [start] = 0 }; var frontier = new Queue(); var attackFrontier = new HashSet(); // Attack Range (Not Made Yet) frontier.Enqueue(start);
// 4) BFS while (frontier.Count > 0) { var cur = frontier.Dequeue(); int curCost = costSoFar[cur];
foreach (var d in _dirs) { var nxt = cur + d; if (!_mapDict.TryGetValue(nxt, out var info)) continue; int newCost = curCost + info.MoveCost; if (newCost > maxCost) continue; // if(Enemy is here) continue; if (!costSoFar.ContainsKey(nxt) || newCost < costSoFar[nxt]) { costSoFar[nxt] = newCost; _FromTo[nxt] = cur; //[destination] -> starting position; frontier.Enqueue(nxt); } } Debug.Log($"FromTo 개수: {_FromTo.Count}"); }
// 5) View square where he can move foreach (var kv in costSoFar) { if (kv.Key == start) continue; Vector3 worldPos = tilemap.GetCellCenterWorld(kv.Key); var go = Instantiate(walkableTilePrefab, worldPos, Quaternion.identity, transform); _walkableOverlays.Add(go); } }
public void DisableWalkableTile() { foreach (var go in _walkableOverlays) Destroy(go); foreach (var go in _routeOverlays) Destroy(go); _walkableOverlays.Clear(); _routeOverlays.Clear(); _FromTo.Clear(); }
public List FindRoute(Transform character, CursorDirector cursor) { int safety = 100; // Prevent Infinite Loop Vector3Int start = tilemap.WorldToCell(character.transform.position); Debug.Log($"[MapDirector] Start: {start}"); Vector3Int goal = tilemap.WorldToCell(cursor.transform.position); var route = new List(); // route.Add(start); // 시작점 추가
if (!_FromTo.ContainsKey(goal)) { Debug.Log("사거리 외 지점으로 판단됩니다."); //msg: Out of MoveRange return null; }
Vector3Int current = goal; while (current != start && safety-- > 0) //While Route gets to Start { route.Add(current); Debug.Log($"[MapDirector] Current: {current}"); if (!_FromTo.TryGetValue(current, out current)) { Debug.LogError("루트를 찾는 도중 오류 발생!"); //msg: Path Finding Error Debug.LogError($"current: {current}, start: {start}"); break; } } route.Reverse();
Я попытался сделать походки BFS на Unity, но я получил недоступную правую и буботочную проблему границы! иду справа или вниз , он говорит «вне диапазона!». Проверено _fromto (хранит стрелки длиной в одну плиту для включения пути) , но это выглядит...
Получение указателя на объект, созданный в хранении существующего объекта
, то же самое, где позабоченные объекты не могут быть
, потому что он не может быть
,...