前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity 协程系统

Unity 协程系统

作者头像
汐夜koshio
发布2021-04-01 16:30:19
7670
发布2021-04-01 16:30:19
举报
文章被收录于专栏:U3D

在使用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);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档