using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class Squad : MonoBehaviour { public abstract class Order // generic order (to keep in queue) { public virtual void PassToSoldier(Soldier targetSoldier) // "translate" the order to the soldier {// depending on implementation, for example call soldier's method to execute/plan this task Debug.LogWarning($"Generic order passing not overriden\nSoldier {targetSoldier.name} received generic order"); } } public class MovementOrder : Order // example how to add new types of orders { public int x; public int y; public override void PassToSoldier(Soldier targetSoldier) {// here we would set soldier's target position for example Debug.Log($"Soldier {targetSoldier.name} received movement order towards coordinates {x},{y}"); } } [SerializeField] private List soldiers = new List(); // soldiers belonging to the squad private Queue orders = new Queue(); // orders given to the squad public void TempAddSoldierToSquad(Soldier soldier) { soldiers.Add(soldier); } private void Awake() { TickSystem.OnTick += HandleTick; } private void HandleTick(TickSystem.OnTickEventArgs eventArgs) {// pass a single order to all soldiers if (orders.Count < 1) return; // for now nothing to do here Order currentOrder = orders.Dequeue(); Debug.Log($"Passing order {currentOrder.ToString()} on tick #{eventArgs.tickNumber}"); foreach (Soldier soldier in soldiers) { currentOrder.PassToSoldier(soldier); } } [ContextMenu("DEBUG ADD PSEUDO MOVEMENT ORDER")] public void DebugAddMovementOrder() { int targetX = 4; int targetY = 2; orders.Enqueue(new MovementOrder() { x = targetX, y = targetY }); } }