UnityGameProjectsCode / DiceAndMenGame / TacticsManager.cs
TacticsManager.cs
Raw
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

public class TacticsManager : MonoBehaviour
{
    [SerializeField] Transform camTarget;
    [SerializeField] List<Enemy> enemies;

    public List<Unit> Units
    {
        get
        {
            if(units == null)
            {
                var all = FindObjectsOfType<Unit>();
                units = new List<Unit>();

                foreach(var u in all)
                {
                    if (u as Enemy)
                        continue;

                    units.Add(u);
                }
            }

            return units;
        }
    }
    List<Unit> units = null;

    public UnityEvent OnWin, OnLose;
    public UnityEvent OnTurnStart;

    public void CheckEnemies()
    {
        foreach(var enemy in enemies)
        {
            if (enemy.gameObject.activeInHierarchy)
                return;
        }

        OnWin.Invoke();
    }

    public void CheckUnits()
    {
        foreach (var unit in Units)
        {
            if (unit.gameObject.activeInHierarchy)
                return;
        }

        OnLose.Invoke();
    }

    public void EndTurn()
    {
        var enemyTurn = StartCoroutine(BeginEnemyTurn());
    }

    IEnumerator BeginEnemyTurn()
    {
        foreach(var unit in enemies)
        {
            if (!unit.CanAttack || !unit.gameObject.activeInHierarchy)
                continue;

            var camStart = camTarget.position;
            for(float t = 0; t < 1; t += Time.deltaTime * 4)
            {
                camTarget.position = Vector3.Slerp(camStart, unit.transform.position, t);

                yield return null;
            }

            yield return new WaitForSeconds(.25f);

            unit.Fight(false);

            yield return new WaitUntil(() => unit.battle == null);

            CheckUnits();
            CheckEnemies();
        }

        foreach (var unit in Units)
        {
            unit.StartTurn();
        }
        foreach (var unit in enemies)
        {
            unit.StartTurn();
        }

        OnTurnStart.Invoke();
    }
}