文章目录
- 前言
- 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,如果学习过程中遇到任何问题,也欢迎你评论私信找我。
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!