Unity 模拟协程实现计时器功能
2017-09-26 19:01
531 查看
众所周知,在Unity里面开启协程会有消耗,有时候就算我们只需要用到一个简单的计时器,必须开一个协程或者自己写一个计时器。这里提供了一个通用的计时器类,里面还实现了内存池管理,使用完的计时器回收备用。
使用方法:只需负责调用即可,内部会自动回收。
使用方法:只需负责调用即可,内部会自动回收。
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class GlobalTimer : MonoBehaviour { private static GlobalTimer instance; public static GlobalTimer Instance { get { if (!instance) { instance = GameObject.FindObjectOfType(); } if (!instance) { GameObject obj = new GameObject(typeof(GlobalTimer).ToString()); instance = obj.AddComponent(); } return instance; } } //正在使用的TimerData private List mUseTimerDatas = new List(); //空闲的TimerData private List mNotUseTimerDatas = new List(); //尝试从空闲池中取一个TimerData private TimerData GetTimerData(bool isAdd = true) { TimerData data = null; if (mNotUseTimerDatas.Count <= 0) { data = new TimerData(); } else { data = mNotUseTimerDatas[0]; mNotUseTimerDatas.RemoveAt(0); } mUseTimerDatas.Add(data); return data; } //创建一个计时器 public TimerData AddTimer(float _duration, Action endCallBack, bool _isIgnoreTime = false) { TimerData data = GetTimerData(); data.Init(_duration, endCallBack, _isIgnoreTime); return data; } //创建一个重复型计时器 public TimerData AddIntervalTimer(float _duration, float _interval, Action _endCallBack, Action _intervalCallBack, bool _isIgnoreTime = false) { TimerData data = GetTimerData(); data.Init(_duration, _endCallBack, _isIgnoreTime, _interval, _intervalCallBack); return data; } protected void Clear(TimerData data) { if (mUseTimerDatas.Remove(data)) { mNotUseTimerDatas.Add(data); } else { Debug.LogWarning("GlobalTimer not find TimerData"); } } #region 测试代码 void Start() { TimerData td1 = GlobalTimer.Instance.AddTimer(5, () => { Debug.Log("5秒后调用该方法1"); }); TimerData td2 = GlobalTimer.Instance.AddIntervalTimer(5, 1, () => { Debug.Log("5秒后调用该方法2"); }, (float remainTime) => { Debug.Log("每一秒调用执行此处:剩余时间" + remainTime); } ); } #endregion void Update() { 4000 for (int i = 0; i < mUseTimerDatas.Count; ++i) { if (!mUseTimerDatas[i].Update()) { //没更新成功,mUseTimerDatas长度减1,所以需要--i --i; } } } public class TimerData { //持续时间 private float mDuration; //重复间隔 private float mInterval; //结束回调 private Action mEndCallBack; //每次重复回调 private Action mIntervalCallBack; //是否忽略时间 private bool isIgnoreTime; //计时器 private float mRunTime; //间隔计时器 private float mRunIntervalTime; //初始化 public void Init(float _duration, Action _endCallBack, bool _isIgnoreTime = false, float _interval = -1f, Action _intervalCallBack = null) { mDuration = _duration; mInterval = _interval; mEndCallBack = _endCallBack; mIntervalCallBack = _intervalCallBack; isIgnoreTime = _isIgnoreTime; mRunTime = 0; mRunIntervalTime = 0; } //更新 public bool Update() { float deltaTime = isIgnoreTime ? Time.unscaledDeltaTime : Time.deltaTime; mRunTime += deltaTime; mRunIntervalTime += deltaTime; if (mIntervalCallBack != null) { if (mRunIntervalTime >= mInterval) { mRunIntervalTime -= mInterval; mIntervalCallBack(mDuration - mRunTime); } } if (mRunTime >= mDuration) { if (mEndCallBack != null) { mEndCallBack(); } Clear(); return false; } return true; } public void Clear() { instance.Clear(this); } public void AddEndCallBack(Action _endCallBack) { mEndCallBack += _endCallBack; } } }
相关文章推荐
- unity计时器功能的实现
- Unity中使用协程实现倒计时功能
- Unity 封装 倒计时(计时器,CountDownTimer),实现周期更新、技能冷却等功能
- 模拟实现printf函数,可完成下面的功能 能完成下面函数的调用。 print("s ccc d.\n","hello",'b','i','t',100); 函数原型: print(char *
- 自己模拟实现strcpy函数功能
- 模拟实现ASP.NET框架基本功能(三)
- unity自带寻路功能实现
- C语言:模拟实现printf,要求功能:print("ccc\ts!",'b','i','t',"welcome to y
- 【CSDN开源夏令营】 基于Web的SSH客户端,实现跨平台的云服务管理(五)模拟复制粘贴功能的实现
- 在 LeanCloud 上模拟事务操作来实现支付功能
- Android模拟点击屏幕,实现按键精灵点击屏幕功能
- Unity Shaders and Effects Cookbook (2-1) 修改 UV 坐标实现纹理贴图的滚动 模拟水流效果
- Unity_塔防游戏按波产生怪(协程实现)_064
- 【Unity快速实现小功能】声音控制三部曲之(二)—— 音效与背景音乐的叠加及控制
- js模拟实现继承功能
- 关于Unity实现游戏录制功能的思考
- MFC 客户区 模拟标题栏 功能 ,实现窗体拖动
- Unity, C# ,TCP实现的一个简单的对话同步功能
- unity项目实现“再按一次退出程序”提示功能