在使用Unity协程时经常遇到以下让人头疼的问题:
1.协程没办法在不继承自MonoBehaviour的类中开启或调用,例如不需要挂载为Unity组件的类,无法开启协程;因为协程原本就是MonoBehaviour类中的方法
2.有时已经开启了某协程A,但协程A还没执行完,这时又要重复开启它自己时,每次都要判断协程A是否还在运行,根据情况考虑是否重新开启抑或终止开启新协程,让人心累
为了更为方便的调教协程,解决以上问题,决定对协程单独封装一下,游戏中的所有协程统一进行管理:
代码语言:javascript复制 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 coroutine = StartCoroutine(enumerator);
20 coroutines.Add(coroutine);
21 return coroutine;
22 }
23
24 public void Kill(Coroutine coroutine)
25 {
26 if (coroutine != null && coroutines.Contains(coroutine))
27 {
28 StopCoroutine(coroutine);
29 coroutines.Remove(coroutine);
30 }
31 }
32 }
关于基类单例可详见:https://cloud.tencent.com/developer/article/1601263
例如在GameHelper帮助类中,开放一个可直接调用的静态延时方法:
代码语言:javascript复制 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也可以很方便的使用协程,循环创建协程时也方便提前中断还未执行的协程。
用法举例:
代码语言:javascript复制1 private Coroutine cor = null;
2
3 cor = GameHelper.Wait(Config.flashCharge.time,
4 () =>
5 {
6 //Do something else..
7 }, cor);