黑魂復刻遊戲的計時器類及按鍵雙擊功能——Unity隨手記
阿新 • • 發佈:2021-06-17
今天實現的內容:
計時器類
計時器類,估計是個遊戲都用得上。我們將專門實現一個計時器類,馬上就會在實現按鈕長按判斷和雙擊判斷中用上。
當時,設定計時器的duration,執行Go方法,計時器狀態將在elapsedTime >= duration時從RUN變為FINISHED,計時器程式碼如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MyTimer { // 計時器的狀態 public enum TIMER_STATE { IDLE, RUN, FINISHED }// 當前計時器的狀態 public TIMER_STATE state; // duration秒之後計時器停止執行 public float duration = 1.0f; // 計時器執行的時間 public float elapsedTime; // 計時器更新方法 public void Tick(float _deltaTimer) { switch (state) { case TIMER_STATE.IDLE: break;case TIMER_STATE.RUN: elapsedTime += _deltaTimer; if (elapsedTime >= duration) state = TIMER_STATE.FINISHED; break; case TIMER_STATE.FINISHED: break; default: break; } }// 計時器開始執行 public void Go() { elapsedTime = 0; state = TIMER_STATE.RUN; } }
使用計時器類實現按鍵雙擊判斷
給MyButton類新增訊號IsExtending,當剛剛鬆開按鍵時,我們會開啟計時器,在計時器執行期間,IsExtending會被設定為true。那麼雙擊的邏輯就很清楚了,只要在IsExtending為true時按下了按鍵,就判斷為雙擊。
下面的程式碼展示了添加了計時器用於設定Extending的MyButton類。要實現雙擊的程式碼還沒有寫出,可以在MyButton類中新增一個新的訊號,或者在需要雙擊判斷的地方檢視當前isExtending和isPressing是否都為true。
using System.Collections; using System.Collections.Generic; using UnityEngine; // 自制按鈕類 public class MyButton { public float extendingDuration = 0.2f; //按鈕的雙擊/連擊判定時長 public bool isPressing = false; //正在按壓 public bool onPressed = false; //剛剛按下 public bool onRelease = false; //剛剛被釋放 public bool isExtending = false; //釋放按鍵後的一段時間內 private bool currentState = false; //當前狀態 private bool lastState = false; //上一幀的狀態 private MyTimer extendingTimer = new MyTimer(); //Extending計時器 // 更新MyButton public void Tick(bool _input) { onPressed = false; //OnPressd只有一種情況下是true 所以每次都先設定為false onRelease = false; //與OnPressed同理 currentState = _input; //按鍵的當前狀態永遠和對應物理按鍵的狀態一致 isPressing = currentState; //是否被按下 按下就是true if (currentState != lastState) //判斷是否剛剛按下按鍵或剛剛鬆開按鍵 { if (currentState == true) onPressed = true; else { onRelease = true; StartTimer(extendingTimer, extendingDuration); } } lastState = currentState; //結束時將上一幀狀態更新為當前幀狀態 isExtending = (extendingTimer.state == MyTimer.TIMER_STATE.RUN) ? true : false; //設定extending } private void StartTimer(MyTimer _timer, float _extDuration) { _timer.duration = _extDuration; _timer.Go(); } }