1. 程式人生 > 其它 >黑魂復刻遊戲的計時器類及按鍵雙擊功能——Unity隨手記

黑魂復刻遊戲的計時器類及按鍵雙擊功能——Unity隨手記

今天實現的內容:
計時器類
計時器類,估計是個遊戲都用得上。我們將專門實現一個計時器類,馬上就會在實現按鈕長按判斷和雙擊判斷中用上。
當時,設定計時器的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();
    }
}