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);

 

posted @ 2021-03-28 15:32  汐夜  阅读(389)  评论(0编辑  收藏  举报