Unity3D Coroutine携程管理器
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携程管理器相关推荐
- coroutine 携程与定时一起混用
--[[ -- added by wsh @ 2017-12-19 -- 协程模块:对Lua协程conroutine进行扩展,使其具有Unity侧协程的特性 -- 注意: -- 1.主线程使用coro ...
- 【Swoole系列3.5】进程池与进程管理器
进程池与进程管理器 我们已经学习过单个进程相关的内容,也学习了进程间如何进行通信,但是,一个一个地进程还是非常不好管理,这不,Swoole 就为我们直接准备好了进程池以及进程管理相关的工具. 进程池 ...
- 喜报云报销与携程商旅达成战略合作 联手打造一站式差旅管理服务
近日,企业移动报销与费控平台"喜报"与中国领先的差旅管理服务供应商携程商旅签署战略合作协议,双方将各自开放接口,将两大平台对接,共同为企业用户提供更加专业.完善的一体化差旅管理与费 ...
- 研发管理-质量与效率提升-混沌工程在携程的实践
研发管理-质量与效率提升-混沌工程在携程的实践 前几天听了携程SRE运维总监方菊女士的演讲,特别有感触,也是因为负责的产品和项目团队在上线过程中出现了很多的故障.本人前几篇文章介绍了携程在故障处理方面 ...
- unity3d发布linux版本_密码管理器 1Password 发布第一个 Linux 测试版本
1Password 是知名的跨平台密码管理器工具,刚刚发布了第一个 Linux 测试版本,拥有创建.搜索建议.共享.剪贴板清理.快捷键等功能.@Appinn 虽然青小蛙不是 Linux 桌面用户,但为 ...
- Unity3d声音管理器AudioManager
播放背景音乐.播放提示音.播放音效.成组播放.声音源复用.音量控制.音效播放位置等等. 写差不多了,发现不是自己想要的风格.没完善呢就过时的感觉.先放着吧... #if UNITY_EDITOR // ...
- 干货 | 携程基于Quasar协程的NIO实践
作者简介 Ryan,携程Java开发工程师,对高并发.网络编程等领域有浓厚兴趣. IO密集型系统在高并发场景下,会有大量线程处于阻塞状态,性能低下,JAVA上成熟的非阻塞IO(NIO)技术可解决该问题 ...
- java 修改最大nio连接数_携程基于Quasar协程的NIO实践
IO密集型系统在高并发场景下,会有大量线程处于阻塞状态,性能低下,JAVA上成熟的非阻塞IO(NIO)技术可解决该问题.目前Java项目对接NIO的方式主要依靠回调,代码复杂度高,降低了代码可读性与可 ...
- 干货 | 万字长文全面解析GraphQL,携程微服务背景下的前后端数据交互方案
作者简介 古映杰,携程研发高级经理,负责前端框架和基础设施的设计.研发与维护.开源项目react-lite和react-imvc作者. 前言 随着多终端.多平台.多业务形态.多技术选型等各方面的发展, ...
最新文章
- MaxCompute Mars开发指南
- Javascript实现表格的全选框
- linux 编译 freescale arm 的gdb server
- 码农不重视文档:开源项目深受其苦
- jlabel字怎么变化_疫情在家烦躁不如学习怎样练好字吧
- 星益小游戏平台源码 内置80多个在线小游戏
- 数据库安全之数据掩码:SQL新功能之动态数据掩码(SQL2016AZURE SQL)
- PHP实现当前文件夹下所有文件和文件夹的遍历
- 宝刀不老: Cookie (转)
- VisualStudio 2010从分析到实施(3)——使用Use Case Diagram设计系统交互
- MFC 单文档、多文档和对话框
- 在深度学习时代如何用 HowNet 搞事情 | 讲座笔记
- 基于FFmpeg的Qt视频播放器
- 通用高拍仪软件_动态展示和教学 良田YL1050AF高拍仪评测
- CIDetector 边缘识别
- CSP-S2020总结
- 傲腾服务器硬盘,Intel傲腾Optane硬盘实测:“高价U盘”,加速性能不错
- 第十七章、区网控制者: Proxy 服务器
- 拆解易鑫2020:担保服务收入猛增,助贷业务营收占比超三成
- 4.5 路径MTU发现
热门文章
- 2018年上半年慈善组织互联网公开募捐事业健康有序发展
- 1989年个人简历_像1989年一样进行计算
- 【每日新闻】区块链将使互联网进入“合久必分”的时代 | 金蝶国际5000万美元投资纷享销客
- 多媒体系统之MediaCodec基本原理及使用(四)
- vue3 element-plus el-dialog 二次封装,多层调用
- 如何在PowerPoint中创建组织结构图
- Python - Python 模拟鼠标和键盘进行基本操作
- 转:Sun Solaris 常用维护命令
- 电脑上卸载软件的残留文件怎么清理?
- php 门户网站,PHP的CMS系统整理