LunarInfantry/Assets/Scripts/EnemyMovement.cs
2026-01-06 23:58:46 -08:00

67 lines
2.1 KiB
C#

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<TileObject> frontier = new();
private HashSet<TileObject> visited = new();
private Dictionary<TileObject, TileObject> currentPaths = new();
public void PathfindToTarget(TileObject target, Entity selectedEntity)
{
frontier.Clear();
visited.Clear();
currentPaths.Clear();
GetTilesInRange(selectedEntity);
TileObject requestedTile = GetPathToTarget(target, selectedEntity);
selectedEntity.currentTile = requestedTile;
selectedEntity.transform.position = requestedTile.transform.position;
}
private void GetTilesInRange(Entity selectedEntity)
{
frontier.Enqueue(selectedEntity.currentTile);
while (frontier.Count > 0)
{
TileObject currentTile = frontier.Dequeue();
foreach (TileObject neighboringTiles in currentTile.neighbors)
{
if (!visited.Contains(neighboringTiles))
{
visited.Add(neighboringTiles);
frontier.Enqueue(neighboringTiles);
currentPaths.TryAdd(neighboringTiles, currentTile);
}
}
}
Debug.Log(frontier.Count);
}
private TileObject GetPathToTarget(TileObject target, Entity selectedEntity)
{
TileObject currentTile = target;
List<TileObject> pathToTarget = new();
while (currentTile != selectedEntity.currentTile)
{
pathToTarget.Add(currentTile);
currentTile = currentPaths[currentTile];
}
pathToTarget.Reverse();
int validMovementRange = Mathf.Min(pathToTarget.Count, selectedEntity.maxMovement) - 1;
return pathToTarget[validMovementRange];
}
}