Unity Mecanim 教學

本教學使用資源商店的 Hand to Hand Set 動作資源( 發行商促銷活動免費下載 )

資源包收錄待機、移動、跳躍、格鬥等動作,提供 InPlace 與 Root Motion 版本

匯入後可先開啟範例場景,檢視資源包提供的角色動作。

 

製作角色移動功能

從 Project 視窗選取遊戲角色的 FBX 檔案,設定動畫類型是 "Humanoid"。

建立一個空白的新場景,加入提供遊戲角色移動的平面,將 Android_SkeletalMesh 拖曳至場景的原點位置。

加入 Character Controller 角色控制器元件,並調整碰撞器的位置與高度。

建立動畫控制器並命名為 “Player Animator Controller” ,將此動畫控制器套用到場景中的遊戲角色。

雙擊剛建立的動畫控制器開啟 Animator 編輯器,空白處右鍵執行 [ Create State > From New Blend Tree ] 建立混合樹。

製作角色的移動功能,雙擊進入 Blend Tree 混合樹編輯狀態,在Animator 編輯器視窗左上方切換 Parameters 分頁標籤。

建立用於控制移動的 Speed (float) 與控制轉向的 Turn (float) 參數,稍後透過 C# 腳本控制這些參數產生移動與轉向。

如果發現角色無法走動,請檢查參數名稱是否正確(大小寫必須相符)。

將混合樹重新命名為 “Locomotion” 並設定 Blend Type = 2D Freeform Directional 混合類型。

再將 Parameters 設為 X = Turn 轉彎幅度 / Y = Speed 移動速度。

從 Project 專案視窗開啟動畫資料夾,找到稍後需要使用的動畫。

選取 Locomotion 混合樹,在 Motion 欄位按下+按鈕並選擇 Add Motion Field 新增動作欄位。

新增的動作欄位預設將呈現圓形排列,可建立 5 個欄位,先參考右下圖設定製作前後移動。

動作欄位依序為 待機、向前走、向前跑、向後走、向後跑,將動作拖曳到對應的欄位。

當 Motion Field 設定之後,混合樹將會出現以下的動作狀態。

此時還沒有控制腳本,可按下 Play 測試遊戲,使用滑鼠直接拖曳調整動畫控制器的 Speed 參數,確認角色是否可前後移動。

當 Speed = 0 時停止; Speed > 0 角色向前移動; Speed < 0 角色向後移動,注意調整數值時角色動作的細微改變。

 

增加轉向動作

前後移動的功能完成後再加上角色的轉彎動作,建立左轉、向左走、右轉、向右走的動作欄位。

 

 

移動控制腳本

新增一個 C# 腳本命名為 "PlayerController" ,腳本的程式碼如下:

將此腳本套用到到遊戲角色,測試角色的移動操作,按著 Shift 鍵角色將從走路變成跑步的動作。

程式碼 anim.SetFloat( ) 的第3個引數是轉換時間,設定 0.2f 讓動作快速轉換,若增加到 5 以上將會明顯感受動作轉換變慢。

變數 thrust 設定角色向上跳的推力,可嘗試設定 100 或更大的數值,因為使用 Rigidbody 剛體元件,若無將出現錯誤訊息。

MissingComponentException There is no 'Rigidbody' attached to the Player game object, but a script is trying to access it.

 

問題.遊戲角色移動時回到原地

 選擇走路、跑步、前進、後退動作,將 Root Transform Position (XZ) 的 Bake Into Pose 取消勾選。

問題.遊戲角色移動時倒地

 選取遊戲角色並將 Rigidbady 剛體元件的 Constraints 展開,勾選 Freeze Rotation 的 XYZ 凍結旋轉。

問題.沒跳躍卻自已向上移動

 選取動畫檔後在 Inspector 找到 Root Transform Position (Y) 勾選 Bake Into Pose ( 預設為勾選狀態) 。

 若希望替換角色建議角色模型為 T-Pose 姿勢,這與動畫檔設定的初始姿勢是 T-Pose 或 A-Pose 有關。

角色的動作狀態的轉換,選取動作狀態後按滑鼠右鍵,執行 Make Transition 然後將箭頭指向到另一個動作狀態。

 

增加跳躍動作

開啟 Player Animator Controller 動畫控制器,新增 Jump (Tigger) 參數,稍後透過腳本觸發跳躍動作。

public float jumpPower;

if(Input.GetButtonDown("Jump")){

rb.AddForce(transform.up * jumpPower);

}

以上的程式碼使用 Rigidbody AddForce 讓遊戲物件向上推,產生跳躍的效果,透過 jumpPower 控制跳躍的力量。

測試遊戲… 注意!目前沒有跳躍的動作,開啟 Animator Controller 動畫控制器,新增 Jump (Trigger) 參數。

建立 Jump 動作狀態,指定一個適當的跳躍動作。

選取 Locomotion 動作狀態,滑鼠右鍵執行 Make Transition 建立到 Jump 跳躍動作的箭頭,增加程式碼:

public float jumpPower;

if(Input.GetButtonDown("Jump")){

anim.SetTrigger("Jump");

rb.AddForce(transform.up * jumpPower);

}

測試遊戲… 角色的跳躍應該在起跳時做動作,但有時已經跳到空中才出現跳躍動作。

選取從 Locomotion 到 Jump 動作的箭頭,在 Inspector 取消勾選 Has Exit Time 選項。

讓前一動作轉變時立即播放下一個動作,而不等待動作完成。

動畫控制器需要加入 "在空中" 與 "落地" 的動作,讓角色的跳躍動作更真實。

Unarmed-Jump ( [email protected] )

Unarmed-Fall ( [email protected] )

Unarmed-Land ( [email protected] )

增加 "跳躍" > "在空中" > "落地" 的箭頭,調整動作狀態的播放速度,確認動作的流暢性。

 

增加攻擊動作

遊戲中的角色通常有多種不同的攻擊方式,先製作單手 武器攻擊的動作。

PS. 遠距離投射攻擊可參閱本站的 Unity Ninja 忍者角色製作教學 [ 連結 ] 。

首先在 Animator Controller 新增 Attack 攻擊的動作狀態,新增 Attack ( Trigger ) 參數。

使用 [email protected] 的 Sword-Attack-R1 攻擊動作。

新增 Locomotion 動作到 Attack 動作的箭頭,設定 Conditions 為 Attack = true 並取消勾選 Has Exit Time 選項。

拿出武器,使用 Armed > [email protected]

收回武器,資源包缺少收回武器動作,使用拿出武器的動作設定 Speed = -1 即可反向播放動作。

武器模型可從資源商店下載或自行製作。

 

增加防禦動作

建立 BlockController 腳本,為遊戲角色增加防禦的動作。

需要在 Project 視窗空白處執行 [ Create > Avatar Mask ] 建立替身遮罩。預設全身都是綠色,代表沒有遮罩。

按下滑鼠右鍵時,角色做出防禦的動作,但需要在防禦時保持可移動。

Sha