Unity 时间管理工具
之前写了一个计时器,用一个单例 TimeManager 中的一个存储委托的字典,在Update反复执行实现,调用方法注册实现,倒计时为0时调用委托,同时从字典中移除,注销没有想到好方法,凑合着先用。
这两天需要一个技能流程配置,我的技能可能会有冲刺后攻击,也可能只有冲刺,也可能只有攻击。如果分别在对象上写 if 各自管理流程,代码排版看着很难受,需要加很多标记变量。所以在 TimeManager 中新建一个存储委托的列表的字典,也是在 Update 中反复执行,调用方法注册,委托返回 bool,当为true时下一帧依旧执行当前委托,当为 false 的时候委托结束,删除当前委托,下一帧进入下一个委托。一个列表中的所有委托都执行结束之后,在字典中删除本条流程列表,一个流程就这样执行结束。
public class TimeManager : MonoSingleton<TimeManager>
{// 计时器事件字典private Dictionary<TimeEvent, float> m_CountDownDict = new Dictionary<TimeEvent, float>();private int processIndex = 0;private Dictionary<int, List<ProcessEvent>> m_ProcessDict = new Dictionary<int, List<ProcessEvent>>();public void Update(){CountDown();RunProcess();}/// <summary>/// 跑流程列表/// </summary>private void RunProcess(){if (m_ProcessDict != null && m_ProcessDict.Count > 0){int[] processArr = m_ProcessDict.Keys.ToArray();for (int i = 0; i < processArr.Length; i++){List<ProcessEvent> _list = m_ProcessDict[processArr[i]];if (_list == null || _list.Count <= 0){m_ProcessDict.Remove(processArr[i]);}else if (_list[0] != null){if (!_list[0]()){_list.RemoveAt(0);if (_list.Count <= 0){m_ProcessDict.Remove(processArr[i]);}}}else{Debug.LogError("一条流程中的对象已消失");m_ProcessDict.Remove(processArr[i]);}}}else if (m_ProcessDict == null){m_ProcessDict = new Dictionary<int, List<ProcessEvent>>();}}/// <summary>/// 注册流程列表/// </summary>/// <param name="processList"></param>/// <returns></returns>public int AddProcessList(List<ProcessEvent> processList){if (m_ProcessDict == null){m_ProcessDict = new Dictionary<int, List<ProcessEvent>>();}m_ProcessDict.Add(processIndex, processList);processIndex++;return processIndex;}/// <summary>/// 移除流程列表/// </summary>/// <param name="processIndex"></param>public void RemoveProcessList(int processIndex){if (m_ProcessDict == null){m_ProcessDict = new Dictionary<int, List<ProcessEvent>>();}if (m_ProcessDict.ContainsKey(processIndex)){m_ProcessDict.Remove(processIndex);}}/// <summary>/// 倒计时/// </summary>private void CountDown(){if (m_CountDownDict != null && m_CountDownDict.Count > 0){TimeEvent[] timeEventArr = m_CountDownDict.Keys.ToArray();for (int i = 0; i < timeEventArr.Length; i++){if (timeEventArr[i] != null && m_CountDownDict[timeEventArr[i]] <= 0){timeEventArr[i]();m_CountDownDict.Remove(timeEventArr[i]);}else if (timeEventArr[i] != null){m_CountDownDict[timeEventArr[i]] -= Time.deltaTime;}else{Debug.LogError("一条倒计时中的对象已消失");m_CountDownDict.Remove(timeEventArr[i]);}}}else if (m_CountDownDict == null){m_CountDownDict = new Dictionary<TimeEvent, float>();}}/// <summary>/// 添加计数器事件/// </summary>/// <param name="countTime">时间</param>/// <param name="timeEvent">事件</param>public void AddCountDownEvent(TimeEvent timeEvent, float countTime){if (m_CountDownDict == null){m_CountDownDict = new Dictionary<TimeEvent, float>();}// TODO 添加失败需要抛出异常if (!m_CountDownDict.ContainsKey(timeEvent)){m_CountDownDict.Add(timeEvent, countTime);}}/// <summary>/// 移除计数器事件/// </summary>/// <param name="timeEvent">事件</param>public void RemoveCountDownEvent(TimeEvent timeEvent)//, string objectName){if (m_CountDownDict == null){return;}// TODO 移除失败需要抛出异常if (m_CountDownDict.ContainsKey(timeEvent)){m_CountDownDict.Remove(timeEvent);}}
}
// 如果返回值为 false 则该流程结束,进入下一流程
public delegate bool ProcessEvent();
// 计数器事件
public delegate void TimeEvent();
Unity 时间管理工具相关推荐
- 最强GTD时间管理工具(OmniFocus Pro 3)能干些什么?支持big sur
OmniFocus Mac破解版是一款强大的任务管理器,它可以大大提高您的工作效率,让您的达成更多目标.而且Omnifocus mac可以让您按可以照自己想要的方式管理自己的任务,帮您更好地实现更多目 ...
- 最强GTD时间管理工具:OmniFocus Pro 3 for Mac支持big sur
OmniFocus Pro 3 中文激活版是一款功能强大且灵活的GTD时间管理工具,可为您提供无干扰的环境,帮助您可以轻松地从邮件,消息,Safari和任何其他第三方应用程序中安排任务,编写备注和剪辑 ...
- GTD时间管理工具Omnifocus 3 Mac中文版
Omnifocus 3 mac 破解版是一款功能强大且灵活的GTD时间管理工具,可为您提供无干扰的环境,帮助您可以轻松地从邮件,消息,Safari和任何其他第三方应用程序中安排任务,编写备注和剪辑信息 ...
- 在线使用的时间管理工具
http://baike.baidu.com/view/102959.htm http://baike.baidu.com/view/470808.htm http://pm.shangxueba.c ...
- 怎样规划自己每天的时间,这个时间管理工具来帮你
每个人每天的时间资源是有限,但我们却有很多任务和事情需要去完成,这就十分考验对时间的规划能力了. 如果没有规划好时间,我们很容易陷入工作和生活的琐事中,感觉时间不够用:很容易拖延任务,导致任务完成不及 ...
- 我好像很久没安利软件给大家啦,今天给大家种草一款OmniFocus for Mac(GTD时间管理工具)标准版
OmniFocus for Mac版是设计用来快速捕捉你的想法,并允许您存储,管理和处理可操作的待办事项.完美的GTD系统,在任何任务上都足够灵活的管理风格,OmniFocus 3 mac中给你一个始 ...
- 在项目管理中如何保持专注,分享一个轻量的时间管理工具【Flow Mac版 - 追踪你在Mac上的时间消耗】
在项目管理和团队作业中,经常面临的问题就是时间管理和优先级管理发生问题,项目被delay,团队工作延后,无法达到预期目标. 这个仿佛是每个人都会遇到的问题,特别是现在这么多的内容软件来分散我们的注意力 ...
- 我的时间管理工具 [GTD]
感谢XDash为我们带来一片这么好的应用分享,原文地址:http://www.fanbing.net/my-gtd-tools.html 为什么要进行时间管理: 屠格涅夫说:"等待的方法有两 ...
- 手机上有好用的时间管理工具吗?
在日常工作中,时间管理是非常重要的一项技能.这样做不仅可以更好地安排工作计划,还能有效减轻工作压力,减少时间的浪费,从而达到提高工作效率的目的.那么,随着手机的普及和智能化移动应用的不断涌现,我们是否 ...
最新文章
- 他25岁当上985博导,今年秋季学生已招满
- ssl双向认证_SSL握手协议不清楚?vTrus为你讲解其详细流程
- LINQ TO LISTT 合并列表
- 二叉树的后续遍历算法实现
- python tkinter怎么读_Tkinter GUI与阅读系列
- mvcc原理_MVCC原理探究及MySQL源码实现分析
- jsp 构建单页应用_如何使用服务器端Blazor构建单页应用程序
- loadRunner目录分析二
- java 小球抛物线_关于【愤怒的小鸟】其中的算法(自由落体,抛物线,碰撞,反弹)...
- 数据库开发工程中,一些不常遇到的难题
- 从Timer中学习优先队列的实现
- Andriod 系统移植基础
- Android Studio 实现视频播放暂停功能
- 【机器学习与算法】python手写算法:Kmeans和Kmeans++算法
- linux下重要目录的作用
- 虚幻4和Unity3D应该学哪个?
- 微信小程序云函数处理客服消息
- java 随机字母_Java基础之随机生成数字和字母
- maven仓库中查找依赖的步骤
- android基于ffmpeg本地视频、在线视频、直播播放器 支持rtmp、rtsp、http等协议