黑魂復刻遊戲的玩家控制器(攻擊的基礎實現)——Unity隨手記
阿新 • • 發佈:2021-06-11
今天實現的內容:
攻擊動畫層
為了加入新的攻擊動畫,我們要設計一個攻擊動畫層。新的動畫層一是為了使老動畫層不至於臃腫,而是為了配置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。