之前写了一个计时器,用一个单例 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 时间管理工具相关推荐

  1. 最强GTD时间管理工具(OmniFocus Pro 3)能干些什么?支持big sur

    OmniFocus Mac破解版是一款强大的任务管理器,它可以大大提高您的工作效率,让您的达成更多目标.而且Omnifocus mac可以让您按可以照自己想要的方式管理自己的任务,帮您更好地实现更多目 ...

  2. 最强GTD时间管理工具:OmniFocus Pro 3 for Mac支持big sur

    OmniFocus Pro 3 中文激活版是一款功能强大且灵活的GTD时间管理工具,可为您提供无干扰的环境,帮助您可以轻松地从邮件,消息,Safari和任何其他第三方应用程序中安排任务,编写备注和剪辑 ...

  3. GTD时间管理工具Omnifocus 3 Mac中文版

    Omnifocus 3 mac 破解版是一款功能强大且灵活的GTD时间管理工具,可为您提供无干扰的环境,帮助您可以轻松地从邮件,消息,Safari和任何其他第三方应用程序中安排任务,编写备注和剪辑信息 ...

  4. 在线使用的时间管理工具

    http://baike.baidu.com/view/102959.htm http://baike.baidu.com/view/470808.htm http://pm.shangxueba.c ...

  5. 怎样规划自己每天的时间,这个时间管理工具来帮你

    每个人每天的时间资源是有限,但我们却有很多任务和事情需要去完成,这就十分考验对时间的规划能力了. 如果没有规划好时间,我们很容易陷入工作和生活的琐事中,感觉时间不够用:很容易拖延任务,导致任务完成不及 ...

  6. 我好像很久没安利软件给大家啦,今天给大家种草一款OmniFocus for Mac(GTD时间管理工具)标准版

    OmniFocus for Mac版是设计用来快速捕捉你的想法,并允许您存储,管理和处理可操作的待办事项.完美的GTD系统,在任何任务上都足够灵活的管理风格,OmniFocus 3 mac中给你一个始 ...

  7. 在项目管理中如何保持专注,分享一个轻量的时间管理工具【Flow Mac版 - 追踪你在Mac上的时间消耗】

    在项目管理和团队作业中,经常面临的问题就是时间管理和优先级管理发生问题,项目被delay,团队工作延后,无法达到预期目标. 这个仿佛是每个人都会遇到的问题,特别是现在这么多的内容软件来分散我们的注意力 ...

  8. 我的时间管理工具 [GTD]

    感谢XDash为我们带来一片这么好的应用分享,原文地址:http://www.fanbing.net/my-gtd-tools.html 为什么要进行时间管理: 屠格涅夫说:"等待的方法有两 ...

  9. 手机上有好用的时间管理工具吗?

    在日常工作中,时间管理是非常重要的一项技能.这样做不仅可以更好地安排工作计划,还能有效减轻工作压力,减少时间的浪费,从而达到提高工作效率的目的.那么,随着手机的普及和智能化移动应用的不断涌现,我们是否 ...

最新文章

  1. 他25岁当上985博导,今年秋季学生已招满
  2. ssl双向认证_SSL握手协议不清楚?vTrus为你讲解其详细流程
  3. LINQ TO LISTT 合并列表
  4. 二叉树的后续遍历算法实现
  5. python tkinter怎么读_Tkinter GUI与阅读系列
  6. mvcc原理_MVCC原理探究及MySQL源码实现分析
  7. jsp 构建单页应用_如何使用服务器端Blazor构建单页应用程序
  8. loadRunner目录分析二
  9. java 小球抛物线_关于【愤怒的小鸟】其中的算法(自由落体,抛物线,碰撞,反弹)...
  10. 数据库开发工程中,一些不常遇到的难题
  11. 从Timer中学习优先队列的实现
  12. Andriod 系统移植基础
  13. Android Studio 实现视频播放暂停功能
  14. 【机器学习与算法】python手写算法:Kmeans和Kmeans++算法
  15. linux下重要目录的作用
  16. 虚幻4和Unity3D应该学哪个?
  17. 微信小程序云函数处理客服消息
  18. java 随机字母_Java基础之随机生成数字和字母
  19. maven仓库中查找依赖的步骤
  20. android基于ffmpeg本地视频、在线视频、直播播放器 支持rtmp、rtsp、http等协议

热门文章

  1. 原码, 反码, 补码详解——北大陈向群老师课堂笔记
  2. 介绍索尼爱立信的Java ME平台
  3. ArcGIS绘制全国数据图步骤及注意事项
  4. Lifeograph 0.7.3发布 基于gtkmm的轻量电子日记本
  5. 动态规划之股票买卖系列问题
  6. PHP实现文字写入图片功能
  7. Pod创建多个容器并访问指定容器
  8. OSPF高级特性 —— LSA-3过滤 + Distribute-list过滤
  9. 华硕灵耀14和x14区别
  10. 23种设计模式大汇总