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.
角色的動作狀態的轉換,選取動作狀態後按滑鼠右鍵,執行 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
|