2018年11月23日 星期五

教學範例 (2): 將官方的 ThirdPersonController 套用 maximo 模型及動畫控制


目標:
  1.  套用 Unity Standard Assets 官方第三人稱物件功能至 maximo 模型角色。
  2.  自訂動畫,並設定 Mecanim 混合動畫功能。
  3.  自訂動畫控制。
實際畫面:

圖中畫面是自訂角色與 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 方法對該參數做設定。

其中在該攻擊動畫被執行完後,才把開關關掉。

程式碼:
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/

沒有留言:

張貼留言

© ERIC RILEY , 自由無須告知轉貼
Background Japanese Sayagata by Olga Libby