黑魂復刻遊戲的玩家控制器(連續攻擊及優化)——Unity隨手記
今天實現的內容:
新增攻擊狀態B
配置好我們的新動畫,將其加入動畫機。首先我們要將Rig中的如圖所示的引數調整好了。
接下來,設定Animation頁下的烘培,烘培旋轉和Y軸,旋轉根據Original,Y軸根據Feet。
要實現連續攻擊,攻擊B要連線到攻擊A之後,在做攻擊A動畫時如果再次按下攻擊鍵,就會從攻擊A轉換到攻擊B,我們的轉換條件是attack。
攻擊A轉換到攻擊B要設定為優先轉換。
最後,修改這個玩意(這叫什麼來著?),我們不需要攻擊A後面的收刀動作和攻擊B前面的起刀動作,這樣做就能“剪”掉這些不需要的動畫了,也就是灰色部分。你也可以直接調整攻擊B動畫的起始位置。
新增攻擊狀態C
和攻擊B一樣,配置好動畫,放到動畫機中就行,轉換條件和之前的也是一樣的。
連擊的優化
在我們之前的設計中,你可以通過快速連按來實現連擊,我們希望玩家打出連擊要更難一點,玩家只能在攻擊快要結束的那一段時間內再按出攻擊鍵才能連擊,而不是隨隨便便就能打出連擊。在接下來我們要實現通過程式碼來重設Attack訊號。確切來說,我們將通過程式碼,在動畫播放完揮砍動作時,將之前輸入的attack訊號給Reset掉,我們將要通過動畫事件(Animation Events)來實現以上功能。
動畫事件可以在動畫資源下新增,如圖所示。我們給需要做上述操作的動畫資源都添加了這個叫ResetTrigger的事件,我們並沒有在事件名稱中具體指明reset哪個trigger,原因是我們想要複用這個事件,我們可以在String引數中指明我們要reset的trigger的名字。
要讓h5遊戲動畫事件得以接收,我們需要在Animator元件的同一個遊戲物體上掛載一個指令碼來實現具體程式碼。
程式碼如下:
public class AnimTriggerController : MonoBehaviour { // 動畫元件 private Animator anim; private void Awake() { anim = GetComponent<Animator>(); } // 動畫事件 用於在執行時將triggerName代表的訊號重置 public void ResetTrigger(stringtriggerName) { anim.ResetTrigger(triggerName); } }
老師在這裡提到了在AnimTriggerController中處理事件的兩種方案,一種是就在AnimTriggerController中拿到我們想要的動畫元件物件,然後處理事件,另一種是AnimTriggerController不直接處理事件,而是將事件再SendMessage到PlayerController中進行處理。在這裡我們採用第一種,因為已經有太多的SendMessage了。