欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > 【unity实战】Animator启用root motion根运动动画,实现完美的动画动作匹配

【unity实战】Animator启用root motion根运动动画,实现完美的动画动作匹配

2025/4/23 3:29:55 来源:https://blog.csdn.net/qq_36303853/article/details/147314996  浏览:    关键词:【unity实战】Animator启用root motion根运动动画,实现完美的动画动作匹配

文章目录

  • 前言
    • 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

所以unityhumanoid动画中通过分析骨骼的结构,计算出模型的重心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 Ybake into pose都给勾上。并把based upon 依据修改成feet
在这里插入图片描述
发现好了很多
在这里插入图片描述

2、走着走着角色走歪了

这就说明我们不该应用前进和后退动画的旋转。那么我们可以把它的root transform rotationbake 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,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词