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 * @param command A command object to add to the queue */ public virtual void AddCommand(Command command) { commandList.Add(command); } /** * Clears all queued commands from the list */ public virtual void Clear() { 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) { Clear(); 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) { Clear(); if (method != null) { method(); } Execute(); } } }