计时器效果图:
Timer用法:
第一种:脚本加到物体上,勾选”自动计时”。
第二种:脚本加到物体上,调用timer.start()方法启动。
第三种:代码中动态添加Timer脚本。
using UnityEngine;public class TimerTest : MonoBehaviour { private void Start () { // 创建一个Timer并开始计时 gameObject.AddComponent().start(1.5f, onTimeup); // 倒计时3秒 gameObject.AddComponent().start(1, 3, onCD, onCDEnd); // 无限计数(repeatCount为<=0时 无限重复) gameObject.AddComponent().start(1, -1, onCount, null); // Timer API Timer timer = gameObject.AddComponent(); timer.delay = 10;// 延迟10秒开始 timer.start(); // 开始计时 timer.stop(); // 暂停计时 timer.reset(); // 重置已计时的时间和次数 timer.restart();// 重新开始计时 reset() + start() } /// 正常计时 private void onTimeup(Timer timer) { print("计时完成"); } /// 倒计时间隔 private void onCD(Timer timer) { print(timer.repeatCount - timer.currentCount); // 3, 2, 1 } /// 倒计时结束 private void onCDEnd(Timer timer) { print(timer.repeatCount - timer.currentCount); // 0 } /// 无限计数 private void onCount(Timer timer) { print(timer.currentCount); // 1, 2, 3…… }}
Timer API:
// 开始/继续计时public void start() {}// 暂停计时public void stop() {}// 停止Timer并重置数据public void reset() {}// 重置数据并重新开始计时public void restart() {}// 开始计时 time时间(秒) onComplete(Timer timer)计时完成回调事件public void start(float time, TimerCallback onComplete) {}// 开始计时 interval计时间隔 repeatCount重复次数 onComplete(Timer timer)计时完成回调事件public void start(float interval, int repeatCount, TimerCallback onComplete) {}// 开始计时 interval计时间隔 repeatCount重复次数// onInterval(Timer timer)计时间隔回调事件// onComplete(Timer timer)计时完成回调事件public void start(float interval, int repeatCount, TimerCallback onInterval, TimerCallback onComplete) {}
Timer.cs
using UnityEngine;using UnityEngine.Events;////// 计时器/// ZhangYu 2018-04-08/// public class Timer : MonoBehaviour { // 延迟时间(秒) public float delay = 0; // 间隔时间(秒) public float interval = 1; // 重复次数 public int repeatCount = 1; // 自动计时 public bool autoStart = false; // 自动销毁 public bool autoDestory = true; // 当前时间 public float currentTime = 0; // 当前次数 public int currentCount = 0; // 计时间隔 public UnityEvent onIntervalEvent; // 计时完成 public UnityEvent onCompleteEvent; // 回调事件代理 public delegate void TimerCallback(Timer timer); // 上一次间隔时间 private float lastTime = 0; // 计时间隔 private TimerCallback onIntervalCall; // 计时结束 private TimerCallback onCompleteCall; private void Start () { enabled = autoStart; } private void FixedUpdate () { if (!enabled) return; addInterval(Time.deltaTime); } ///增加间隔时间 private void addInterval(float deltaTime) { currentTime += deltaTime; if (currentTime = interval) { currentCount++; lastTime = currentTime; if (repeatCount <= 0) { // 无限重复 if (currentCount == int.MaxValue) reset(); if (onIntervalCall != null) onIntervalCall(this); if (onIntervalEvent != null) onIntervalEvent.Invoke(); } else { if (currentCount < repeatCount) { //计时间隔 if (onIntervalCall != null) onIntervalCall(this); if (onIntervalEvent != null) onIntervalEvent.Invoke(); } else { //计时结束 stop(); if (onCompleteCall != null) onCompleteCall(this); if (onCompleteEvent != null) onCompleteEvent.Invoke(); if (autoDestory && !enabled) Destroy(this); } } } } ///开始/继续计时 public void start() { enabled = autoStart = true; } ///开始计时 /// 时间(秒) /// 计时完成回调事件 public void start(float time, TimerCallback onComplete) { start(time, 1, null, onComplete); } ///开始计时 /// 计时间隔 /// 重复次数 /// 计时完成回调事件 public void start(float interval, int repeatCount, TimerCallback onComplete) { start(interval, repeatCount, null, onComplete); } ///开始计时 /// 计时间隔 /// 重复次数 /// 计时间隔回调事件 /// 计时完成回调事件 public void start(float interval, int repeatCount, TimerCallback onInterval, TimerCallback onComplete) { this.interval = interval; this.repeatCount = repeatCount; onIntervalCall = onInterval; onCompleteCall = onComplete; reset(); enabled = autoStart = true; } ///暂停计时 public void stop() { enabled = autoStart = false; } ///停止Timer并重置数据 public void reset(){ lastTime = currentTime = currentCount = 0; } ///重置数据并重新开始计时 public void restart() { reset(); start(); }}
TimerEditor.cs
using UnityEditor;using UnityEngine;////// 计时器 编辑器/// ZhangYu 2018-04-08/// [CanEditMultipleObjects][CustomEditor(typeof(Timer))]public class TimerEditor : Editor { public override void OnInspectorGUI() { Timer script = (Timer)target; // 重绘GUI EditorGUI.BeginChangeCheck(); // 公开属性 drawProperty("delay", "延迟时间(秒)"); drawProperty("interval", "间隔时间(秒)"); drawProperty("repeatCount", "重复次数"); if (script.repeatCount <= 0) EditorGUILayout.LabelField(" ", "<=0 时无限重复", GUILayout.ExpandWidth(true)); EditorGUILayout.BeginHorizontal(); drawProperty("autoStart", "自动计时"); drawProperty("autoDestory", "自动销毁"); EditorGUILayout.EndHorizontal(); // 只读属性 GUI.enabled = false; drawProperty("currentTime", "当前时间(秒)"); drawProperty("currentCount", "当前次数"); GUI.enabled = true; // 回调事件 drawProperty("onIntervalEvent", "计时间隔事件"); drawProperty("onCompleteEvent", "计时完成事件"); if (EditorGUI.EndChangeCheck()) serializedObject.ApplyModifiedProperties(); } private void drawProperty(string property, string label) { EditorGUILayout.PropertyField(serializedObject.FindProperty(property), new GUIContent(label), true); }}
相关文章:
用PEAR::Benchmarking之Timer实现PHP程序计时
如何使用纯PHP实现定时器任务(Timer),定时器timer
相关视频:
玩转javascript之有声计算器实例
以上就是简要分析Unity计时器脚本Timer的用法(附代码)的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1432813.html
微信扫一扫
支付宝扫一扫