using System.Collections.Generic; using UnityEngine; public class EnemyMovement : MonoBehaviour { #region Statication public static EnemyMovement instance; private void Awake() { if (instance != null && instance != this) { Destroy(gameObject); return; } instance = this; } #endregion private Queue allMovableTiles = new(); private Queue currentMovableTiles = new(); private Dictionary currentPaths = new(); public void PathfindToTarget(TileObject target, Enemy selectedEntity) { allMovableTiles.Clear(); currentMovableTiles.Clear(); currentPaths.Clear(); GetTilesInRange(selectedEntity); TileObject requestedTile = GetPathToTarget(target, selectedEntity); selectedEntity.currentTile = requestedTile; selectedEntity.transform.position = requestedTile.transform.position; } private void GetTilesInRange(Enemy selectedEntity) { foreach (TileObject tileObject in selectedEntity.currentTile.neighbors) { if (!tileObject.blocked && !tileObject.hasUnit) { currentMovableTiles.Enqueue(tileObject); allMovableTiles.Enqueue(tileObject); currentPaths.Add(tileObject, selectedEntity.currentTile); } } for (int i = 0; i < selectedEntity.maxMovement - 1; i++) { foreach (TileObject tileObject in currentMovableTiles.ToArray()) { foreach (TileObject neighboringTiles in tileObject.neighbors) { if (!neighboringTiles.blocked && !neighboringTiles.hasUnit) { currentMovableTiles.Enqueue(neighboringTiles); currentPaths.TryAdd(neighboringTiles, tileObject); } } } } foreach (TileObject tileObject in allMovableTiles.ToArray()) { foreach (TileObject neighboringTiles in tileObject.neighbors) { if (!neighboringTiles.blocked && !neighboringTiles.hasUnit) { allMovableTiles.Enqueue(neighboringTiles); currentPaths.TryAdd(neighboringTiles, tileObject); } } } } private TileObject GetPathToTarget(TileObject target, Enemy selectedEntity) { TileObject currentTile = target; List pathToTarget = new(); TileObject pathTileInRange = null; while (currentTile != selectedEntity.currentTile) { pathToTarget.Add(currentTile); currentTile = currentPaths[currentTile]; } for (int i = 0; i < pathToTarget.Count; i++) { if (currentMovableTiles.Contains(pathToTarget[i])) { pathTileInRange = pathToTarget[i]; return pathTileInRange; } } List pathToRange = new(); /*if (pathTileInRange != null) { while (pathTileInRange != selectedEntity.currentTile) { pathToTarget.Add(pathTileInRange); pathTileInRange = currentPaths[pathTileInRange]; } return pathToRange; }*/ return null; } }