using UnityEngine; using System; using System.Collections; using System.Collections.Generic; namespace Fungus { // Manages a sequential list of commands. // When a command completes, the next command is popped from the queue and exectuted. public class CommandQueue : MonoBehaviour { // Base class for commands used with the CommandQueue public abstract class Command { public abstract void Execute(CommandQueue commandQueue, Action onComplete); } List commandList = new List(); // Adds a command to the queue for later execution public virtual void AddCommand(Command command) { commandList.Add(command); } // Clears all queued commands from the list public virtual void Reset() { commandList.Clear(); } // Executes the first command in the queue. // When this command completes, the next command in the queue is executed. public virtual void Execute() { if (commandList.Count == 0) { return; } Command command = commandList[0]; command.Execute(this, delegate { commandList.RemoveAt(0); Execute(); }); } // Calls a named method on a game object to populate the command queue. // The command queue is then executed. public void CallCommandMethod(GameObject target, string methodName) { Reset(); target.SendMessage(methodName, SendMessageOptions.DontRequireReceiver); Execute(); } // Calls an Action delegate method to populate the command queue. // The command queue is then executed. public void CallCommandMethod(Action method) { Reset(); if (method != null) { method(); } Execute(); } } }