目標:
- 套用 Unity Standard Assets 官方第三人稱物件功能至 maximo 模型角色。
- 自訂動畫,並設定 Mecanim 混合動畫功能。
- 自訂動畫控制。
實際畫面:
圖中畫面是自訂角色與 Third-PersonController 擁有同一功能之情景。
匯入必要材料
匯入項目有:
- 官方第三人稱: Import Package -> Characters
- 從 Maximo 網站下載模型及預設動畫(請選擇動畫以及角色後按下 Download)
- 將 Maximo 下載回來的 .fbx 檔案直接丟進 Unity 的 Project 框內,會直接變成 Prefab。
*匯入地板 Terrain ,請額外自行處理
調整設定
下載回來的 .fbx 檔案匯入後會變成一個 Prefab 預製物件,首先須對該 Prefab 物件修改動畫類型,才能套用到通用人物控制動畫,因為這個模型已經有綁定 IK。
直接選擇 Prefab,然後在 Inspector 選擇 Rig 然後把 Animation Type 更改為: Humanoid。
接著,把該 Prefab 拖曳到 Scene 場景中,然後找到 Standard Assets 資料夾裡面的 Characters -> ThirdPersonController -> Scripts ,把除了 AI 以外的兩個檔案,套用在剛才放入場景的角色身上。
然後,角色的 Components 裡面就會多出兩個物件: Rigidbody, Capsule Collider。
請先調下圖紅色區域中的 Capsule Collider 碰撞器的高度值 height 跟 y 軸的值,使碰撞器剛好在角色的腳上。
然後,綠色的區域要加入 Standard Assets 資料夾裡面的 Characters -> ThirdPersonController -> Animator -> [ThirdPersonAnimatorController] 這個檔案,把它拖進綠色框框的 Controller 裡面。
目前為止,匯入的新角色應該可以和 ThirdPersonController 一樣 WASD 走動了。
動畫控制器
*請先到 Window -> Animator 打開動畫控制器工作視窗。
從 maximo 官方下載的 .fbx 之中有一個動畫,即是自訂動畫需要的檔案之一,請先打開 [ThirdPersonAnimatorController] 這個動畫控制器(是剛剛拖到 Controller 的動畫控制器)。
然後把 .fbx 這個 prefab 裡面的動畫丟進 Animator 工作視窗。
丟進來後,就會看到 Animator 視窗剛才丟進來的動畫,這裡需要點開遊戲觀察一下,這些動畫的閒置區域會在哪裡,此範例中 ThirdPersonController 是停留在 Grounded 中,所以請對剛才丟進來的動畫它點擊右鍵,選擇 Make Transition ,並且指向到 Grounded 這個動畫,然後也從 Grounded 做 Make Transition 到自訂的動畫,如下圖紅色區域。
接著,這個動畫要啟動,可以使用參數設定,從程式控制參數後就可以改變動畫播放的路線,因此,從上圖黃色區域的欄位進去後,選擇綠色區塊的 + ,然後新增一個 Bool 當作開關,命名為 startPunch。 (因為本篇文章的動畫是揮拳動畫)
接著,從動畫中要轉移路徑的設定,請選擇 Grounded 到自訂動畫的區塊,然後根據這下圖把開關拿掉,並新增一個 Condition。
程式自訂控制方法
從腳本來看,要控制 Animator 中的參數 (startPunch) 的開關值,可以先取得該物件的 Animator ,然後用 Animator 類別的 Set 方法對該參數做設定。
其中在該攻擊動畫被執行完後,才把開關關掉。
程式碼:
完成後,請將腳本自行套用在角色物件上。
Reference:
https://www.mixamo.com/
其中在該攻擊動畫被執行完後,才把開關關掉。
程式碼:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class punchAnimator : MonoBehaviour { void Update () { Animator punchAni = this.GetComponent<Animator>(); if (punchAni.GetCurrentAnimatorStateInfo(0).IsName("Boxing")) { punchAni.SetBool("startPunch", false); } if(Input.GetKeyDown(KeyCode.P)){ punchAni.SetBool("startPunch",true); //force change animator status } } }
完成後,請將腳本自行套用在角色物件上。
Reference:
https://www.mixamo.com/
沒有留言:
張貼留言