Unity3D Coroutine携程管理器

  • 个人需求
  • 使用效果
  • 思路原理
  • 代码实现
  • 未来优化

在Unity3D的编程中携程一直占据很重要的位置,上到场景加载下到值渐变都有携程的参与.
但是目前网上对于携程的管理并没有较好的解决方案,所以个人实现了一套携程管理机制

个人需求

实现携程管理器,对携程的创建销毁进行全局管理.

使用效果

使用范例:

public class TestScript : MonoBehaviour,ISingleCoroutine
{private void Awake(){this.StartSingleCoroutine(1, Tick1(1));this.StartSingleCoroutine(2, Tick1(2));this.StartSingleCoroutine(2, Tick1(3));this.StartSingleCoroutine(3, Tick2());this.StopSingleCoroutine(3);}private void OnDestroy(){this.StopAllSingleCoroutines();}IEnumerator Tick1(int i){for (; ; ){Debug.Log("Howdy"+i);yield return null;}}IEnumerator Tick2(){for (; ; ){Debug.Log("Hello Thereeeee");yield return null;}}
}

效果:

思路原理

个人理解的携程机制:
Update内遍历,满足条件则执行.

携程的创建与销毁:
创建:StartCoroutine重载,会返回Coroutine以供管理 只使用参数为IEnumerator的重载 否则会造成较高开销.
销毁:StopCoroutine重载,使用参数为Coroutine的重载达到针对单个携程的管理.

范例:

public class TestScript : MonoBehaviour
{private void Awake(){Coroutine cor_temp;       //缓存cor_temp = StartCoroutine(IETemp());       //创建StopCoroutine(cor_temp);        //销毁}IEnumerator IETemp(){for (; ; ){Debug.Log("Howdy");yield return null;}}
}

所以对创建产生的Coroutine进行管理即可实现需求

代码实现

思路:
1.将所有携程集中到一个Monobehaviour单例中管理
2.需要使用携程的脚本继承接口并分配接口ID
3.通过接口从元函数创建与销毁携程

:
SingleTonMono 为个人使用的Mono单例模板类,初始化时创建实例

管理器单例:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public interface ISingleCoroutine //定义接口
{}
class CoroutineManager : SingletonMono<CoroutineManager>  //管理器单例 调用时创建
{internal static List<ISingleCoroutine> L_Target = new List<ISingleCoroutine>();internal static Dictionary<int, Coroutine> Dic_Coroutines = new Dictionary<int, Coroutine>();Dictionary<int, Coroutine> CoroutineDic = new Dictionary<int, Coroutine>();internal static void QuestForRange(ISingleCoroutine target, ref int min, ref int max)    //接口请求携程ID范围{min = L_Target.FindIndex(p => p == target) * 1000;max = min + 999;}internal static int QuestForIndex(ISingleCoroutine target, int index)      //携程请求ID{int targetIndex = 0;if (!L_Target.Contains(target))L_Target.Add(target);targetIndex += L_Target.FindIndex(p => p == target) * 1000;targetIndex += index;return targetIndex;}
}

接口从元函数:

public static class ISingleCoroutine_Extend
{public static void StartSingleCoroutine(this ISingleCoroutine target, int index, IEnumerator numerator)    //开启单例携程{if (index < 0)Debug.LogWarning(" Should Not Add Coroutine Index Which Below 0");int targetIndex = CoroutineManager.QuestForIndex(target, index);if (CoroutineManager.Dic_Coroutines.ContainsKey(targetIndex))if (CoroutineManager.Dic_Coroutines[targetIndex] != null)CoroutineManager.Instance.StopCoroutine(CoroutineManager.Dic_Coroutines[targetIndex]);elseCoroutineManager.Dic_Coroutines.Add(targetIndex, null);CoroutineManager.Dic_Coroutines[targetIndex] = CoroutineManager.Instance.StartCoroutine(numerator);}public static void StopSingleCoroutine(this ISingleCoroutine target, int index = 0)    //终止单例携程{int targetIndex = CoroutineManager.QuestForIndex(target, index);if (CoroutineManager.Dic_Coroutines.ContainsKey(targetIndex) && CoroutineManager.Dic_Coroutines[targetIndex] != null)CoroutineManager.Instance.StopCoroutine(CoroutineManager.Dic_Coroutines[targetIndex]);}public static void StopAllSingleCoroutines(this ISingleCoroutine target)     //终止单个接口申请的所有单例携程{int min=0, max = 0;CoroutineManager.QuestForRange(target,ref min,ref max);foreach (int index in CoroutineManager.Dic_Coroutines.Keys){if (index >= min && index <= max)CoroutineManager.Instance.StopCoroutine(CoroutineManager.Dic_Coroutines[index]);}}public static void StopSingleCoroutines(this ISingleCoroutine target, params int[] indexes)        //终止多个携程{for (int i = 0; i < indexes.Length; i++)StopSingleCoroutine(target, indexes[i]);}
}

未来优化

1.还未进行容错处理,如申请一个超过999的ID会出现ID冲突
2.用int作为携程ID索引不是很直观,可以采用枚举代替
3.能够在此基础上实现DoTween的效果(用Transform代替接口与单例ID并增加从元函数)

该文章只能提供思路,个人学疏才浅,无法保证是否会产生性能问题.                           --StriteR 2019/3/22

Unity3D Coroutine携程管理器相关推荐

  1. coroutine 携程与定时一起混用

    --[[ -- added by wsh @ 2017-12-19 -- 协程模块:对Lua协程conroutine进行扩展,使其具有Unity侧协程的特性 -- 注意: -- 1.主线程使用coro ...

  2. 【Swoole系列3.5】进程池与进程管理器

    进程池与进程管理器 我们已经学习过单个进程相关的内容,也学习了进程间如何进行通信,但是,一个一个地进程还是非常不好管理,这不,Swoole 就为我们直接准备好了进程池以及进程管理相关的工具. 进程池 ...

  3. 喜报云报销与携程商旅达成战略合作 联手打造一站式差旅管理服务

    近日,企业移动报销与费控平台"喜报"与中国领先的差旅管理服务供应商携程商旅签署战略合作协议,双方将各自开放接口,将两大平台对接,共同为企业用户提供更加专业.完善的一体化差旅管理与费 ...

  4. 研发管理-质量与效率提升-混沌工程在携程的实践

    研发管理-质量与效率提升-混沌工程在携程的实践 前几天听了携程SRE运维总监方菊女士的演讲,特别有感触,也是因为负责的产品和项目团队在上线过程中出现了很多的故障.本人前几篇文章介绍了携程在故障处理方面 ...

  5. unity3d发布linux版本_密码管理器 1Password 发布第一个 Linux 测试版本

    1Password 是知名的跨平台密码管理器工具,刚刚发布了第一个 Linux 测试版本,拥有创建.搜索建议.共享.剪贴板清理.快捷键等功能.@Appinn 虽然青小蛙不是 Linux 桌面用户,但为 ...

  6. Unity3d声音管理器AudioManager

    播放背景音乐.播放提示音.播放音效.成组播放.声音源复用.音量控制.音效播放位置等等. 写差不多了,发现不是自己想要的风格.没完善呢就过时的感觉.先放着吧... #if UNITY_EDITOR // ...

  7. 干货 | 携程基于Quasar协程的NIO实践

    作者简介 Ryan,携程Java开发工程师,对高并发.网络编程等领域有浓厚兴趣. IO密集型系统在高并发场景下,会有大量线程处于阻塞状态,性能低下,JAVA上成熟的非阻塞IO(NIO)技术可解决该问题 ...

  8. java 修改最大nio连接数_携程基于Quasar协程的NIO实践

    IO密集型系统在高并发场景下,会有大量线程处于阻塞状态,性能低下,JAVA上成熟的非阻塞IO(NIO)技术可解决该问题.目前Java项目对接NIO的方式主要依靠回调,代码复杂度高,降低了代码可读性与可 ...

  9. 干货 | 万字长文全面解析GraphQL,携程微服务背景下的前后端数据交互方案

    作者简介 古映杰,携程研发高级经理,负责前端框架和基础设施的设计.研发与维护.开源项目react-lite和react-imvc作者. 前言 随着多终端.多平台.多业务形态.多技术选型等各方面的发展, ...

最新文章

  1. MaxCompute Mars开发指南
  2. Javascript实现表格的全选框
  3. linux 编译 freescale arm 的gdb server
  4. 码农不重视文档:开源项目深受其苦
  5. jlabel字怎么变化_疫情在家烦躁不如学习怎样练好字吧
  6. 星益小游戏平台源码 内置80多个在线小游戏
  7. 数据库安全之数据掩码:SQL新功能之动态数据掩码(SQL2016AZURE SQL)
  8. PHP实现当前文件夹下所有文件和文件夹的遍历
  9. 宝刀不老: Cookie (转)
  10. VisualStudio 2010从分析到实施(3)——使用Use Case Diagram设计系统交互
  11. MFC 单文档、多文档和对话框
  12. 在深度学习时代如何用 HowNet 搞事情 | 讲座笔记
  13. 基于FFmpeg的Qt视频播放器
  14. 通用高拍仪软件_动态展示和教学 良田YL1050AF高拍仪评测
  15. CIDetector 边缘识别
  16. CSP-S2020总结
  17. 傲腾服务器硬盘,Intel傲腾Optane硬盘实测:“高价U盘”,加速性能不错
  18. 第十七章、区网控制者: Proxy 服务器
  19. 拆解易鑫2020:担保服务收入猛增,助贷业务营收占比超三成
  20. 4.5 路径MTU发现

热门文章

  1. 2018年上半年慈善组织互联网公开募捐事业健康有序发展
  2. 1989年个人简历_像1989年一样进行计算
  3. 【每日新闻】区块链将使互联网进入“合久必分”的时代 | 金蝶国际5000万美元投资纷享销客
  4. 多媒体系统之MediaCodec基本原理及使用(四)
  5. vue3 element-plus el-dialog 二次封装,多层调用
  6. 如何在PowerPoint中创建组织结构图
  7. Python - Python 模拟鼠标和键盘进行基本操作
  8. 转:Sun Solaris 常用维护命令
  9. 电脑上卸载软件的残留文件怎么清理?
  10. php 门户网站,PHP的CMS系统整理