開始製作遊戲了,首先我想談一下UE的開發方式,主要分為C++和Blueprint兩種 。
缺點:
兩種方式都有顯著的優缺點,如果詢問多數的開發者該使用哪種開發方式,得到的答案幾乎都是混著用,我們可以用C++處理底層邏輯,並在Blueprint中進行高層次的設計和快速調整,這種方式結合性能和靈活性,劃清兩者扮演的角色。
那麼問題來了,實際上哪些部份該用C++,哪些該用Blueprint呢?我的規劃是,所有基礎Class和底層邏輯都用C++撰寫,讓Blueprint繼承這些Class來扮演實例化、賦值和呼叫涵式的角色,其他高層次的素材和系統也都交給Blueprint,例如動畫系統、音效、特效等等。
舉個例子,在C++中創建AMyCharacter這個Class,在裡面定義所有相關變數和函式,並用Blueprint繼承AMyCharacter來賦予Stats、Mesh、Animation Blueprint等等相關變數,又例如在射擊系統中,C++負責武器數值宣告和射擊邏輯運算,Blueprint負責武器配置、音效特效等操作。
上篇文章有提到本遊戲其中一個要點是擬真的角色動畫系統,而Motion Matching(以下簡稱MM)能讓角色動畫系統有大幅的提升,MM 通過從龐大的動畫資料庫中根據角色當前的移動狀態,動態選擇最適合的動畫片段。這樣可以在不依賴繁複的動畫轉換設定下,實現更自然、連貫的角色動作過渡,使角色在移動和動作中看起來更加逼真。
UE官方在5.4版本提供了非常棒的MM範例檔案,不僅有高品質的Locomotion,還包括流暢的Traversal動畫,讓我驚艷不已,並毅然決然將它整合到我的遊戲中。 (雖然尚未具備蹲下和衝刺的動畫,但之後5.5版本會陸續新增)
首先遇到的問題是該MM動畫使用的是UEFN骨架, 而其我的動畫資源基本上都是Mannequin,Mannequin的相容性也比專給Fortnite來的好,因此只能想辦法將MM動畫Retarget到Mannequin,雖然能夠逐個Retarget,但要重新設置Database、Chooser Table和Anim Blueprint會變得非常麻煩,因此我先暫時使用Real Time Retargeting的方法,在遊戲進行的同時獲取一個Mesh上的動畫,並在另一個Mesh上Retarget並重現,實際方法就是創造一個虛擬的Mesh來執行MM動畫,在真實Mesh的Anim Blueprint中獲取該動畫並執行其他動作,如此一來就能將MM和其他動畫系統分開開發。
不幸的是目前Traversal動畫有Root Motion的問題(只有在主Mesh撥放的動畫可以影響Root Motion,虛擬Mesh沒辦法),可能要把Traversal動畫Retarget到Mannequin並改在主要Anim Blueprint播放,可能也需要更動或重新撰寫邏輯,這部份未來解決了會再和大家分享。
有了基礎Locomotion後,其他狀態(例如持槍)該怎麼辦呢?雖然可以直接用其他動畫取代,但非MM和MM動畫的操作和流暢度有著相當大的落差,玩家肯定不會想要拿個槍整個角色動作就不一樣,因此我嘗試了一個點子,在持槍時,讓下半身保持MM,上半身用持槍動畫混合,這樣就可以在維持角色流暢度的情況下,實現持槍動畫。
UE的Lyra Starter Game是個蠻龐大的第三人稱射擊範例,如果細探程式碼和結構會發現相當的複雜,但同時可用資源也很豐富,我嘗試將Lyra的射擊動畫整合進遊戲中,並實作持槍的Locomotion系統。
以類似原檔案的方式,在State Machine中使用Linked Layer來根據不同武器執行不同動畫,這樣能夠保持擴充性,未來有其他動畫也能加入。由於著重於上半身,拿掉了一些用不著的功能(像Stride Warping和Orientation Warping等對下半身影響的功能),並嘗試不同動畫和MM混合的效果,來決定要使用哪些動畫才看起來最順暢。
接下來介紹目前的動畫系統,主要就是將持槍Locomotion和MM混合,並設置不同的Slate和混合條件來建構出完整的動畫系統,以下會一一簡單描述。
動畫上仍有許多需要調整的地方,步槍和霰彈槍的跑姿相當不自然,拿槍和收槍的動畫也不太符合本遊戲,之後會找其他動畫取代掉,本次日誌就寫到這邊,基本上就是統整一下腦袋想法和審視進度,詳細技術和遇到的問題實在沒辦法一一寫出來,如果你有興趣或是想一起討論的話,歡迎留言或是私訊我,感謝你的閱讀!