Unity计时器功能实现示例

计时器在很多地方都可以使用,本文主要介绍了Unity计时器功能实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Unity计时器

Demo展示

介绍

游戏中有非常多的计时功能,比如:各种cd,以及需要延时调用的方法;

一般实现有一下几种方式:

1.手动计时

 float persistTime = 10f float startTime = Time.time; if(Time.time - startTime > persistTime) { Debug.Log("计时结束"); } float curTime = 0; curTime += Time.deltaTime; if(curTime > persistTime) { Debug.Log("计时结束"); }

2.协程

 private float persistTime = 10f; IEnumerator DelayFunc() { yield return persistTime; Debug.Log("计时结束"); } private void Start() { StartCoroutine(DelayFunc()); }

3.Invoke回调

 private void Start() { Invoke("DelayFunc", persistTime); } 

计时器功能

计时是为了到特定的时间,执行某个功能或方法;

计时器(Timer):设计了计时暂停,计时重置,计时开始方法,计时中方法,计时结束方法,固定间隔调用方法,计时器可设置复用或单次;

计时管理器(TimerMa):负责倒计时,以及执行计时器方法;

代码:

 using System; using System.Collections.Generic; using UnityEngine; using Object = System.Object; public class Timer { public delegate void IntervalAct(Object args); //总时间和当前持续时间 private float curtime = 0; private float totalTime = 0; //激活 public bool isActive; //计时结束是否销毁 public bool isDestroy; //是否暂停 public bool isPause; //间隔事件和间隔事件——Dot private float intervalTime = 0; private float curInterval = 0; private IntervalAct onInterval; private Object args; //进入事件 public Action onEnter; private bool isOnEnter = false; //持续事件 public Action onStay; //退出事件 public Action onEnd; public Timer(float totalTime, bool isDestroy = true, bool isPause = false) { curtime = 0; this.totalTime = totalTime; isActive = true; this.isDestroy = isDestroy; this.isPause = isPause; TimerMa.I.AddTimer(this); } public void Run() { //暂停计时 if (isPause || !isActive) return; if (onEnter != null) { if (!isOnEnter) { isOnEnter = true; onEnter(); } } //持续事件 if (onStay != null) onStay(); curtime += Time.deltaTime; //间隔事件 if (onInterval != null) { curInterval += Time.deltaTime; if (curInterval > intervalTime) { onInterval(args); curInterval = 0; } } //计时结束 if (curtime > totalTime) { curtime = 0; isActive = false; if (onEnd != null) { onEnd(); } } } //设置间隔事件 public void SetInterval(float interval, IntervalAct intervalFunc, Object args = null) { this.intervalTime = interval; onInterval = intervalFunc; curInterval = 0; this.args = args; } //重置计时器 public void Reset() { curtime = 0; isActive = true; isPause = false; curInterval = 0; isOnEnter = false; } //获取剩余时间 public float GetRemainTime() { return totalTime - curtime; } } 
 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class TimerMa : MonoBehaviour { #region 单例 private static TimerMa instance; TimerMa() {} public static TimerMa I { get { if (instance == null) instance = new TimerMa(); return instance; } } #endregion private List timerList; private void Awake() { instance = this; timerList = new List(); } public void AddTimer(Timer t) { timerList.Add(t); } void Update() { for (int i = 0; i 

测试计时器

 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using Object = System.Object; public class Test : MonoBehaviour { public Text mText1; public Text mText2; private Timer timer; private int count = 0; void Start() { timer = new Timer(5f,false); timer.SetInterval(1f, OnInterval); timer.onEnter = OnStart; timer.onEnd = OnExit; } void Update() { Debug.Log(count); mText1.text = timer.GetRemainTime().ToString("f2"); if (Input.GetKeyDown(KeyCode.A)) { if (!timer.isPause) { timer.isPause = true; mText2.text = "暂停计时"; } } if (Input.GetKeyDown(KeyCode.S)) { if (timer.isPause) { timer.isPause = false; mText2.text = "取消暂停计时"; } } if (Input.GetKeyDown(KeyCode.D)) { timer.Reset(); mText2.text = "重置计时"; } } private void OnStart() { mText2.text = "开始计时"; } private void OnExit() { mText2.text = "结束计时"; } private void OnInterval(Object value) { count++; mText2.text = $"间隔事件调用{count}"; } }

到此这篇关于Unity计时器功能实现示例的文章就介绍到这了,更多相关Unity计时器内容请搜索0133技术站以前的文章或继续浏览下面的相关文章希望大家以后多多支持0133技术站!

以上就是Unity计时器功能实现示例的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 其他教程