Unity 协程系统

2021-04-01 16:30:19 浏览数 (1)

在使用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);

0 人点赞