UnityGameProjectsCode / DiceAndMenGame / MovementGrid.cs
MovementGrid.cs
Raw
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);
    }
}