您好,登錄后才能下訂單哦!
小編給大家分享一下Unity計時器腳本Timer的用法案例,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
計時器效果圖:
Timer用法:
第一種:腳本加到物體上,勾選"自動計時"。
第二種:腳本加到物體上,調用timer.start()方法啟動。
第三種:代碼中動態添加Timer腳本。
using UnityEngine; public class TimerTest : MonoBehaviour { private void Start () { // 創建一個Timer并開始計時 gameObject.AddComponent<Timer>().start(1.5f, onTimeup); // 倒計時3秒 gameObject.AddComponent<Timer>().start(1, 3, onCD, onCDEnd); // 無限計數(repeatCount為<=0時 無限重復) gameObject.AddComponent<Timer>().start(1, -1, onCount, null); // Timer API Timer timer = gameObject.AddComponent<Timer>(); timer.delay = 10;// 延遲10秒開始 timer.start(); // 開始計時 timer.stop(); // 暫停計時 timer.reset(); // 重置已計時的時間和次數 timer.restart();// 重新開始計時 reset() + start() } /// <summary> 正常計時 </summary> private void onTimeup(Timer timer) { print("計時完成"); } /// <summary> 倒計時間隔 </summary> private void onCD(Timer timer) { print(timer.repeatCount - timer.currentCount); // 3, 2, 1 } /// <summary> 倒計時結束 </summary> private void onCDEnd(Timer timer) { print(timer.repeatCount - timer.currentCount); // 0 } /// <summary> 無限計數 </summary> 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; /// <summary> /// 計時器 /// <para>ZhangYu 2018-04-08</para> /// </summary> 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); } /// <summary> 增加間隔時間 </summary> private void addInterval(float deltaTime) { currentTime += deltaTime; if (currentTime < delay) return; if (currentTime - lastTime >= 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); } } } } /// <summary> 開始/繼續計時 </summary> public void start() { enabled = autoStart = true; } /// <summary> 開始計時 </summary> /// <param name="time">時間(秒)</param> /// <param name="onComplete(Timer timer)">計時完成回調事件</param> public void start(float time, TimerCallback onComplete) { start(time, 1, null, onComplete); } /// <summary> 開始計時 </summary> /// <param name="interval">計時間隔</param> /// <param name="repeatCount">重復次數</param> /// <param name="onComplete(Timer timer)">計時完成回調事件</param> public void start(float interval, int repeatCount, TimerCallback onComplete) { start(interval, repeatCount, null, onComplete); } /// <summary> 開始計時 </summary> /// <param name="interval">計時間隔</param> /// <param name="repeatCount">重復次數</param> /// <param name="onInterval(Timer timer)">計時間隔回調事件</param> /// <param name="onComplete(Timer timer)">計時完成回調事件</param> 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; } /// <summary> 暫停計時 </summary> public void stop() { enabled = autoStart = false; } /// <summary> 停止Timer并重置數據 </summary> public void reset(){ lastTime = currentTime = currentCount = 0; } /// <summary> 重置數據并重新開始計時 </summary> public void restart() { reset(); start(); } }
TimerEditor.cs
using UnityEditor; using UnityEngine; /// <summary> /// 計時器 編輯器 /// <para>ZhangYu 2018-04-08</para> /// </summary> [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); } }
看完了這篇文章,相信你對Unity計時器腳本Timer的用法案例有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。