Unity 协程系统
在使用Unity协程时经常遇到以下让人头疼的问题:
1.协程没办法在不继承自MonoBehaviour的类中开启或调用,例如不需要挂载为Unity组件的类,无法开启协程;因为协程原本就是MonoBehaviour类中的方法
2.有时已经开启了某协程A,但协程A还没执行完,这时又要重复开启它自己时,每次都要判断协程A是否还在运行,根据情况考虑是否重新开启抑或终止开启新协程,让人心累
为了更为方便的调教协程,解决以上问题,决定对协程单独封装一下,游戏中的所有协程统一进行管理:
1 using UnityEngine; 2 using System.Collections.Generic; 3 using System.Collections; 4 5 public class CoroutineSystem : MonoSingleton<CoroutineSystem> 6 { 7 public List<Coroutine> coroutines = new List<Coroutine>(); 8 9 public Coroutine Creat(IEnumerator enumerator) 10 { 11 var coroutine = StartCoroutine(enumerator); 12 coroutines.Add(coroutine); 13 return coroutine; 14 } 15 16 public Coroutine Creat(IEnumerator enumerator, Coroutine coroutine) 17 { 18 Kill(coroutine); 19 return Creat(enumerator); 20 } 21 22 public void Kill(Coroutine coroutine) 23 { 24 if (coroutine != null && coroutines.Contains(coroutine)) 25 { 26 StopCoroutine(coroutine); 27 coroutines.Remove(coroutine); 28 } 29 } 30 31 public void KillAll() 32 { 33 coroutines.ForEach(x=> 34 { 35 StopCoroutine(x); 36 }); 37 coroutines.Clear(); 38 } 39 }
关于基类单例可详见:https://www.cnblogs.com/koshio0219/p/11203631.html
例如在GameHelper帮助类中,开放一个可直接调用的静态延时方法:
1 public static Coroutine Wait(float delay, UnityAction callback, Coroutine coroutine = null) 2 { 3 return CoroutineSystem.Instance.Creat(IEWait(delay, callback), coroutine); 4 } 5 6 public static IEnumerator IEWait(float delay, UnityAction callback) 7 { 8 yield return new WaitForSeconds(delay); 9 callback.Invoke(); 10 }
这样一来,即使外部类不继承MonoBehaviour也可以很方便的使用协程,循环创建协程时也方便提前中断还未执行的协程。
用法举例:
1 private Coroutine cor = null; 2 3 cor = GameHelper.Wait(Config.flashCharge.time, 4 () => 5 { 6 //Do something else.. 7 }, cor);