文章目錄
- 前言
- 1、動畫分類
- 2、如何使用根位移動畫?
- 一、根位移動畫的具體使用
- 1、導入人形模型
- 2、導入動畫
- 3、配置動畫參數
- 4、配置角色Animator動畫狀態機
- 5、使用代碼控制人物前進后退
- 二、問題分析
- 三、Humanoid動畫中的Root Motion機制及相關配置
- 1、Humanoid動畫中的Root Motion機制和動畫復用原理
- 2、Root Motion相關配置
- 2.1 root transform rotation 根變換旋轉
- (1)bake into pose 烘培成的動作
- (2)loop match 循環匹配
- (3)based upon 依據:根旋轉的基礎
- 2.2 root transform position 根變換位置
- (1)bake into pose 烘培成的動作
- (2)based upon 依據
- 2.3 Root Transfom Position (XZ) 根變換位置(XZ)
- (1)bake into pose 烘培成的動作
- (2)based upon 依據
- 3、總結:`humanoid`動畫配置最近實踐
- 四、問題修復
- 1、角色下沉問題修復
- 2、走著走著角色走歪了
- 五、Root Motion動畫位移還受到物體縮放的影響
- 專欄推薦
- 完結
前言
1、動畫分類
在游戲開發中,我們常見的動畫文件一般分為兩種:
in place原地動畫
:也就是不帶位移的動畫root motion根運動動畫
:也就是自帶“根位移
”的動畫
這種所謂自帶“根位移
”的動畫能夠帶來的好處是顯而易見的,它有效地避免了角色動畫和實際位移不同步的現象。比如我們經常可能會出現的滑步問題。
2、如何使用根位移動畫?
如果對Animator的知識還不了解,可以先去查看:【unity游戲開發——Animator動畫】
如果在項目中使用自帶位移的動畫,只需要勾選Animaator上的Apply Root Motion
選項即可。
一、根位移動畫的具體使用
1、導入人形模型
模型可以隨意選擇,這里我使用的是最近很火的:mita米塔模型。
2、導入動畫
如果你還不知道如何使用mixamo,可以查看:【游戲資源】獲取免費開源的人物模型,為obj fbx人物模型綁定人形骨骼和人形動畫,并導入到unity中使用——mixamo的使用介紹
我們可以從mixamo下載兩個前進和后退的root motion根運動動畫
3、配置動畫參數
配置動畫為人形,且可循環播放
4、配置角色Animator動畫狀態機
Animator狀態機配置也非常簡單,兩個bool參數控制動畫切換即可
5、使用代碼控制人物前進后退
注意:這里使用的是InputSystem輸入控制,如果你還不了解如何使用。可以先去看看:【unity游戲開發——InputSystem】
使用代碼控制人物前進后退。因為使用了root motion
動畫改變位置,所以在這個腳本里,我們完全不需要處理角色的位移。
using UnityEngine;
using UnityEngine.InputSystem;public class PlayerController : MonoBehaviour
{Animator animator;PlayerInput playerInput;Vector2 vector2;void Awake(){playerInput = GetComponent<PlayerInput>();animator = GetComponent<Animator>();}private void OnEnable() {// 輸入觸發事件,任何輸入都會觸發該事件playerInput.onActionTriggered += OnActionTrigger;}void OnDisable() {playerInput.onActionTriggered -= OnActionTrigger;}private void OnActionTrigger(InputAction.CallbackContext context){switch (context.action.name){case "Move":// 獲取輸入的方向值(Vector2類型)vector2 = context.ReadValue<Vector2>();// 如果Y軸方向的值大于0(向前)if (vector2.y > 0f){animator.SetBool("isForward", true);}else{animator.SetBool("isForward", false);}// 如果Y軸方向的值小于0(向后)if (vector2.y < 0f){animator.SetBool("isBackward", true);}else{animator.SetBool("isBackward", false);}break;}}
}
掛載腳本,配置參數
效果
二、問題分析
- 角色似乎并沒有走直線,我們只是按了前進和后退,她居然發生了轉向,走著走著走歪了。
- 而且似乎角色的高度也在下降,待機狀態下發現人物的腳都陷到了地下了。
這些問題我們后面再一一解決。
三、Humanoid動畫中的Root Motion機制及相關配置
1、Humanoid動畫中的Root Motion機制和動畫復用原理
root motion
會把動畫文件中描述的對游戲對象的坐標和角度值轉換為相對位移和相對轉角,并以此來移動游戲對象。
在generic泛型
動畫中root motion
會把動畫文件中描述的根骨骼坐標值和角度值轉換為相對位移和相對轉角,并以此來移動游戲對象。
那么到了humanoid
動畫里,由于使用了Avatar
系統,動畫文件不再包含對具體骨骼的描述我們自然也就無法通過指定根骨骼來應用roo motion
。
所以unity
在humanoid
動畫中通過分析骨骼的結構,計算出模型的重心center of mass
,這個重心也可以被稱為body transform
,在預覽動畫這里激活下面這個選項,就可以看見它的重心,一般是在人物的中間位置。
我們可以把這個unity
計算出來的root transform
,當做humanoid
動畫下代表root motion
的根骨骼節點,通過這種方式,我們就可以在不同的骨骼結構上復用同一個root motion
動畫
2、Root Motion相關配置
unity把root motion
劃分成了三個部分
2.1 root transform rotation 根變換旋轉
根位置的旋轉相關,要注意一下,root motion的旋轉特指繞y軸的旋轉。
(1)bake into pose 烘培成的動作
勾選表示root motion不使用動畫自帶的旋轉。
(2)loop match 循環匹配
這里的這個紅色標記代表了這個動畫在角度上的吻合度
如果這個動畫在播放中的轉角過大,這里就會提示紅色
,告訴我們這個動畫如果勾選了bake into pose
則會帶來不好的效果,比如如果我們是帶旋轉的動畫。
而對于動畫過程中轉角較小的動畫,比如說行走這里就會提示呈綠色
,告訴我們可以勾選。
總結:要不要勾選bake into pose取決于我們需不需要動畫來驅動游戲對象的旋轉,而能不能勾選,則要參考這里loop match的紅色或綠色提示。
(3)based upon 依據:根旋轉的基礎
這里指的是游戲對象在動畫開始時對準的方向是哪里。
- Original:保持源文件中的原始旋轉
- Root Node Rotation:使用根節點的旋轉(僅適用Generic通用動畫類型)
- Body Orientation:保持上半身朝前(僅適用于Humanoid人形動畫類型)
Generic和humanoid動畫這里的參數有所區別,唯一區別是,Generic動畫里的root motion
是基于根骨骼root node
的,所以這里可以把根骨骼的朝向當做動畫的朝向。而humanoid
的動畫并沒有根骨骼,所以Unity就把計算出來的重心body transform身體方向
的方向放在這里供我們選擇。
由于humanoid
的方向是Unity
計算出來的,所以一般情況下也不太準
,所以大家如果是使用Mixamo上的動畫的話,這里一般選擇original
原始。
2.2 root transform position 根變換位置
沿y軸的位移
(1)bake into pose 烘培成的動作
將垂直根運動烘焙到骨骼移動。禁用此選項將會存儲為根運動。假如移動不勾選根對象可能會上下移動,勾選了根對象不會上下移動,更平穩。一般都是勾選的。
(2)based upon 依據
垂直方向上把模型的哪個位置對齊到游戲對象的原點上。
- Original:保持源文件中的垂直位置。默認是
original原始
,也就是3D美術設置的動畫原點。 - Root Node Position:使用垂直根位置(僅適用Generic通用動畫類型)
- Center Of Mass:保持質心與根位置對其(僅適用Humanoid人形動畫類型)。
center of mass
質心或重心就是我們前面提到過的,unity計算出的那個body transform
,選擇它的話可以看到游戲對象的位置對齊到了重心的位置。
- Feet:(注意這里英寸是翻譯有問題,翻譯成
腳
才對),保持雙腳與根變換位置對齊(僅適用Humanoid人形動畫類型)。Feet
就是模型的腳,或者說Avatar系統下的腳。在generic
動畫中是沒有腳這個慨念的,它只是處理單純的骨骼。而在humanoid
動畫中,借助Avatar我們是可以明確的知道每一塊的骨骼對應人體的結構。我們選擇feet
試一下,可以發現它和original
的差別并不大。
那么這個feet和original的區別在哪?以及我們應該選擇哪一個呢?
我們可以相信Mixamo
中的original
,因為這個original就是動畫美術為我們提供的原點。但是那僅限于generic
動畫,而在humanoid
動畫中,因為動畫的復用會使得動畫發生一系列的變形。
簡單來說,動畫原本是針對A模型制作的,那么這個original
或者說原點就是A模型播放動畫時的原點,當我們使用B模型復用這個動畫時,我們沒有辦法保證Avatar轉移后的原點,還能夠保持其原來的準確性。所以當我們選擇original
時,如果發現效果不佳,除了調節下面的offset
之外還可以考慮這個feet
選項。
比如我們當前選擇的這個idle
動畫,在選擇original時,角色的腳已經陷到地面以下。
我們改成feet試一下,發現好了一點。
2.3 Root Transfom Position (XZ) 根變換位置(XZ)
就是root motion在水平平面上x和z軸的位移設置。
(1)bake into pose 烘培成的動作
將水平根運動烘焙到骨骼移動。禁用此選項將會存儲為根運動。可以理解為不勾選根對象會水平運動,勾選了只會播動畫根對象不會水平運動。
如果我們不希望這個動畫控制角色在水平方向上位移,就勾選這里的bake into pose 烘培成的動作
,比如待機動畫,原地轉身動畫,原地起跳動畫都可以勾選。
(2)based upon 依據
- Original:保持源文件中的水平位置
- Root Node Position:使用水平根位置(僅適用Generic通用動畫類型)
- Center Of Mass:保持與根位置對其(僅適用Humanoid人形動畫類型)
這里的center of mass
指的就是重心在水平平面的投影位置。
3、總結:humanoid
動畫配置最近實踐
-
bake into pose烘培成的動作
:要不要勾選取決于我們需不需要動畫來驅動游戲對象,而能不能勾選,則要參考這里loop match循環匹配
的紅色或綠色提示。
-
root transform rotation 根變換旋轉的based upon 依據
:body transform身體方向
參數是Unity計算出來的,一般情況下不太準,所以這里我們一般選擇original原始
。
-
root transform position 根變換位置的based upon 依據
:humanoid
動畫中,因為動畫的復用會使得動畫發生一系列的變形。這里最好選擇feet腳
。(注意這里英寸是翻譯有問題,翻譯成腳
才對)
四、問題修復
有了前面的介紹,我們現在可以對Root Motion動畫的問題進行修復了。
1、角色下沉問題修復
問題就是不該處理垂直位移的動畫在控制角色對象的垂直位移,把動畫的root transform position Y
的bake into pose
都給勾上。并把based upon 依據
修改成feet
。
發現好了很多
2、走著走著角色走歪了
這就說明我們不該應用前進和后退動畫的旋轉。那么我們可以把它的root transform rotation
的bake into pose
給勾上,并修改based upon為origina
。
如果切換成original還是有點歪的話,大家可以手動調整一下這里的offset偏移。
效果,我們可以看到現在角色不會走著走著歪了,問題解決
五、Root Motion動畫位移還受到物體縮放的影響
還有一點需要注意,那就是Root Motion
動畫位移還受到物體縮放的影響。比如除了縮放不一樣,其他條件完全一樣的一大一小兩個角色,它的移動距離是不一樣的。
如果大角色的移動速度是1,那么縮放了0.1的小角色移動速度就是0.1。具體可以參考:Unity中Root Motion的核心機制
專欄推薦
地址 |
---|
【unity游戲開發入門到精通——C#篇】 |
【unity游戲開發入門到精通——unity通用篇】 |
【unity游戲開發入門到精通——unity3D篇】 |
【unity游戲開發入門到精通——unity2D篇】 |
【unity實戰】 |
【制作100個Unity游戲】 |
【推薦100個unity插件】 |
【實現100個unity特效】 |
【unity框架/工具集開發】 |
【unity游戲開發——模型篇】 |
【unity游戲開發——InputSystem】 |
【unity游戲開發——Animator動畫】 |
【unity游戲開發——UGUI】 |
【unity游戲開發——聯網篇】 |
【unity游戲開發——優化篇】 |
【unity游戲開發——shader篇】 |
完結
好了,我是向宇
,博客地址:https://xiangyu.blog.csdn.net,如果學習過程中遇到任何問題,也歡迎你評論私信找我。
贈人玫瑰,手有余香!如果文章內容對你有所幫助,請不要吝嗇你的點贊評論和關注
,你的每一次支持
都是我不斷創作的最大動力。當然如果你發現了文章中存在錯誤
或者有更好的解決方法
,也歡迎評論私信告訴我哦!