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(); } }