zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    语言模型的压缩方法
    推荐算法之 Slope One 算法
    基于内容的推荐(Contentbased Recommendations)
    Txt文件转换为Excel文件
    WebResource 内嵌资源
    多层模态窗口showModalDialog页面提交及刷新
    屏蔽/自定义JavaScript脚本错误
    .net动态显示当前时间
    客户端自动累加
    中国IT管理之窥豹一斑
  • 原文地址:https://www.cnblogs.com/koshio0219/p/14519371.html
Copyright © 2011-2022 走看看