使用命令模式 把命令封成对象 然后不管用Update还是协程 都行
也可以将行为都做成一个协程 下面结构可以参考一下 public class PlayQueuedSystem { static Dictionary<CoroutineQueued, PlayQueuedSystem> coroutineQueueds; /// <summary> /// 协程队列组 /// </summary> public static Dictionary<CoroutineQueued, PlayQueuedSystem> CoroutineQueueds { get { if (coroutineQueueds == null) coroutineQueueds = new Dictionary<CoroutineQueued, PlayQueuedSystem>(); return coroutineQueueds; } } /// <summary> /// 所有者 /// </summary> MonoBehaviour sender; public Queue<PlayQueueItem> PlayQueue { get; private set; } /// <summary> /// 是否正在运行 /// </summary> public bool Runing { get { return runing; } } private bool runing = false; public PlayQueuedSystem(MonoBehaviour sender, CoroutineQueued queued) { PlayQueue = new Queue<PlayQueueItem>(); this.sender = sender; if (!CoroutineQueueds.ContainsKey(queued)) { CoroutineQueueds.Add(queued, this); } else Debug.LogError ("重复的CoroutineQueued"); } public PlayQueuedSystem(MonoBehaviour sender) { PlayQueue = new Queue<PlayQueueItem>(); this.sender = sender; } public void AddQueueItem(PlayQueueItem queueItem) { if (PlayQueue == null) PlayQueue = new Queue<PlayQueueItem>(); PlayQueue.Enqueue(queueItem); } /// <summary> /// 开始运行协程队列 /// </summary> public void StartQueue() { runing = true; IEnumerator queueRuning = QueueRuning(); MonoTools.AddCoroutines(sender, this, sender.StartCoroutine(queueRuning), queueRuning); } /// <summary> /// 停止队列执行,不会影响正在实行的内容 /// </summary> public void StopQueue() { runing = false; } Coroutine nowIEnumerator; IEnumerator QueueRuning() { while (runing) { if (PlayQueue.Count > 0) { nowIEnumerator = sender.StartCoroutine(MonoTools.QueueItem(PlayQueue.Dequeue(), null)); yield return nowIEnumerator; } else yield return new WaitForSeconds(0.5f); } } /// <summary> /// 略过当前执行协程 /// </summary> /// <param name="nowIEnumerator"></param> public void IgnoreNowCoroutine(Coroutine nowIEnumerator) { if(nowIEnumerator!=null) sender.StopCoroutine(nowIEnumerator); } }}
|