using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Tilemaps; public class MovementGrid : MonoBehaviour { [SerializeField] protected Tilemap gizmo; [SerializeField] TileBase passableTile, impassableTile, unitTile, enemyTile, selfTile; Unit selected; /// <summary> /// Selects unit and constructs movement selection grid based off of the given unit's current state. /// </summary> /// <param name="unit"></param> public void Display(Unit unit) { selected = unit; gizmo.transform.position = unit.transform.position; gizmo.ClearAllTiles(); if (!unit) return; gizmo.gameObject.SetActive(true); //Set terrain tiles (passable/impassable) foreach((TerrainTile tile, Vector3Int position) in unit.GetTilesInMoveRange()) { if (!tile) continue; switch(tile.Type) { case TerrainTile.TerrainType.Impassable: gizmo.SetTile(position, impassableTile); break; case TerrainTile.TerrainType.Passable: gizmo.SetTile(position, passableTile); break; } } //Set unit tiles DisplayUnits<Unit>(selected, unitTile); //Set enemy tiles DisplayUnits<Enemy>(selected, enemyTile); //Set self tiles gizmo.SetTile(Vector3Int.zero, selfTile); } protected virtual void DisplayUnits<T>(Unit unit, TileBase tile) where T : Unit { foreach(var (u, pos) in unit.GetUnitsInMoveRange<T>()) { gizmo.SetTile(pos, tile); } } /// <summary> /// Sends move command to the selected unit. /// </summary> /// <param name="delta"></param> public void Move(Vector3Int delta) { if (!selected) return; selected.Move(delta); } /// <summary> /// Selects and sends move command to the provided unit. /// </summary> /// <param name="unit"></param> /// <param name="delta"></param> public void Move(Unit unit, Vector3Int delta) { selected = unit; Move(delta); } public void Fight() { var enemy = selected as Enemy; if (!enemy) return; enemy.Fight(true); } }