1. 程式人生 > 其它 >黑魂復刻遊戲的玩家控制器(攻擊的基礎實現)——Unity隨手記

黑魂復刻遊戲的玩家控制器(攻擊的基礎實現)——Unity隨手記

今天實現的內容:

攻擊動畫層

為了加入新的攻擊動畫,我們要設計一個攻擊動畫層。新的動畫層一是為了使老動畫層不至於臃腫,而是為了配置Avatar Mask。

配置Avatar Mask

新建一個Avatar Mask,我知道這裡是多個Avatar Mask。我們需要的是一個全身都被選擇的Mask。將Mask放到動畫層設定裡面。

接下來要做的就是,在攻擊時調整動畫層權重。這要在程式碼中做到。在進入程式碼之前,給idle新增StateMachineBehaviour指令碼FSMClearSignals。我們需要清除的是attack訊號來防止累積。

攻擊訊號輸入

和翻滾一樣攻擊屬於一次性觸發訊號。由於使用鍵盤,所以我們採用MouseButtonDown(0)。

    // 一次性訊號
    public bool attack; //攻擊訊號
    
    // Update is called once per frame
    void Update()
    {
        // ...
        
        // 攻擊訊號
        attack = Input.GetMouseButtonDown(0);
        attack = Input.GetKeyDown(keyAttack);
    }

攻擊動畫的基本程式碼邏輯

由於有了attack層,我們的動畫機控制程式碼複雜了一點。我們需要使用程式碼修改動畫層的權重。

    // 進入Attack層的動畫節點attack_oneHand_A時執行的方法
    // 通過PlayerController動畫機中的attack_oneHand_A節點上掛載的FSMOnEnter呼叫
    public void OnAttack_oneHandAEnter()
    {
        // 關閉輸入模組
        pi.inputEnabled = false;
        // 修改攻擊動畫層權重為1
        m_anim.SetLayerWeight(m_anim.GetLayerIndex("Attack"), 1.0f);
    }

    
// 在Attack層的動畫節點attack_oneHand_A更新時執行的方法 // 通過PlayerController動畫機中的attack_oneHand_A節點上掛載的FSMOnEnter呼叫 public void OnAttack_oneHandAUpdate() { // 計算攻擊時的衝量 m_thrustVec = model.transform.forward * m_anim.GetFloat("attackOneHandAVelocity") * m_planarVec.magnitude * 4f; } // 進入Attack層的動畫節點idle時執行的方法 // 通過PlayerController動畫機中的idle節點上掛載的FSMOnEnter呼叫 public void OnAttackIdleEnter() { // 開啟輸入模組 pi.inputEnabled = true; // 修改攻擊動畫層權重為0 m_anim.SetLayerWeight(m_anim.GetLayerIndex("Attack"), 0); }

方法依舊是熟悉的配方,通過FSMOnEnter的SendMessage來告訴PlayerController當前進入攻擊動畫了,進而重新設定層權重。m_anim.GetLayerIndex來讓程式幫你找到LayerIndex。
接下來,攻擊時我們的角色不能再按玩家的輸入任意移動,否則會很奇怪(很明顯了)。所以在攻擊時要輸入模組關閉,不用鎖定平面移動(m_lockPlanar)。
如果角色在攻擊時本身處於移動狀態,我們就需要表現出慣性,網路遊戲角色需要向前衝一點,要實現這個效果,可以使用和jab類似的方案,也就是在攻擊動畫中加入一個曲線表示衝量的速度大小,只不過這次還要和m_planarVec.magnitude相乘,才能和角色的速度相關,得到的就是看起來不錯的慣性效果。至於為什麼移動時攻擊會在關閉輸入模組之後還能得到慣性效果,是因為我們的輸入模組不是直接將輸入值拿來就用,而是使用了Slerp。