1. 程式人生 > 其它 >黑魂復刻遊戲的玩家控制器(後跳、奔跑、翻滾、跳躍的再重新設計)——Unity隨手記

黑魂復刻遊戲的玩家控制器(後跳、奔跑、翻滾、跳躍的再重新設計)——Unity隨手記

今天實現的內容:
黑魂網路遊戲中後跳、翻滾、跳躍的鍵位設計
在黑魂遊戲中,後跳和翻滾是由一個鍵實現的,在站立不動時,按下(哪怕你是按住)該鍵會後跳。移動時單擊該鍵會翻滾,按住該鍵時移動會奔跑。奔跑時按下跳躍鍵才能跳躍。最大的問題就是要區分同一個按鍵的單擊和按住,我們將採用的方案為通過計算按下按鍵的時間來判斷到底是按住了還是單擊。
而在鍵盤上,跳躍和後跳翻滾奔跑居然都是一個鍵(預設space),通過奔跑時快速再按下該鍵來實現跳躍,而手柄上連按兩下該鍵是翻滾。

單擊和按住的程式碼實現

    // 按鍵按壓計時器
    private float pressTimer;
    // 單擊的間隔時間 小於等於這個時間是單擊 大於這個時間是長按(Long Press)
private float clickIntervalTime = 0.2f; // 長按還是單擊 決定是衝刺還是翻滾/後躍 private void RollOrRun(string _key) { if (Input.GetKeyDown(_key)) { timer = 0; } if (Input.GetKeyUp(_key) && timer <= clickLimitTime) { jab_roll = true
; } else { jab_roll = false; } if (Input.GetKey(_key)) { timer += Time.deltaTime; if (timer > clickLimitTime) run = true; } else { run = false; } }

運用

    // Update is called once per frame
    void Update()
    {
        // ...
        
        // 跳躍訊號
        if (run && Input.GetKeyDown(keyB))
            jump = true;
        else
            jump = false;

        //衝刺/後躍/翻滾訊號
        RollOrRun(keyA);
    }

BUG以及缺陷:

本來原計劃是實現鍵盤上的操作,也就是跳躍也由翻滾這個鍵控制。但是效果不佳,所以跳躍設計為另一個鍵,這是原計劃實現的邏輯。能用,但是跳不遠,我已經受夠了。

    // 雙擊計時器
    private float doubleClickTimer;
    // 開始檢測雙擊
    private bool startDoubleClickCheck = false;
        
    private float doubleClickIntervalTime = 0.2f;
    
    private void RollJab_Run_Jump_Signal(string _keyRollJabOrRun, string _keyJump)
    {
        // ...
        
        // 雙擊檢測
        if(startDoubleClickCheck)
        {
            doubleClickTimer += Time.deltaTime;
            startDoubleClickCheck = (doubleClickTimer > doubleClickIntervalTime) ? false : true;

            // 跳躍訊號
            if (Input.GetKeyDown(_keyJump))
            {
                jump = true;
            }
            else
            {
                jump = false;
            }
        }
        else
        {
            jump = false;
        }
    }

值得注意的:

小細節,黑魂的跳躍落地動作也是有兩種的,一種是落地時蹲一下,一種是落地時翻滾,似乎是跟起跳速度有關。