在Unity3D的Legacy动画系统中应用Root Motion

【Unity动画系统】详解Root Motion动画在Unity中的应用(一) 什么时候勾选Bake into pose,当不希望动画带动游戏对象旋转时。在旋转的动画中一般是不用勾选的,因为就需要用它来带动我们的角色对象旋转。但在比如前进、后退、待机等动画来说,我们就可以勾选这里,以避免因动画文件本身的瑕疵而给我们带来的旋转。loop match:代表了这个动画在角度上的吻合度。如果这个动画在播放中转角过大,那么就会显示红色,告诉我们如果勾选bake into pose,则会带来不好的效果。 阅读详情

 

           最近仔细比较了目前版本中的两套动画系统:Legacy和Mecanim。Mecanim系统功能较之Legacy要强大很多,但是使用AnimatorController着实不方便(尽管使用AnimatorOverrideController可以避免重复编辑状态机),是因为游戏逻辑层面往往要用一个状态机或者类似的机制来控制角色的状态,而角色层面的状态逻辑和动画层面是无法一一对应的,两套复杂的状态机要配合起来。。。想想就觉得蛋疼啊!难怪很多朋友现在还在使用Legacy动画系统。Legacy动画系统其实功能也很全面了,包括Layer、过渡混合、上下身混合之类的功能完全能够胜任,而且控制起来就直接的多了。唯独Root Motion这个我很需要特性没有支持,本文就探讨一下如何在Legacy动画系统之上附加Root Motion功能,其实很简单 。


何谓Root Motion

在不使用Root Motion的情况下,类似走、跑这样的位移控制是这样的:

1.    请美术在导出动画时把位移去掉;
2.    在程序代码里控制角色移动的速度,在播放动画的同时,计算其位移。
这种做法其实挺不科学的,程序控制的角色,只能当做一个质点来处理,并且大多数时候都是匀速运动,而动画中的角色的移动往往很难跟这个匹配。所以需要比较良好的计算和比较好的美术技巧才能避免角色“滑步”的现象。在“跑”这种快速移动这,滑步还比较好处理,如果是慢速移动。。。。再厉害的美术也爱莫能助了。这种情况下,最好还是使用Root Motion:
1.    美术在导出动画的时候是附带位移的;
2.    程序把动画的每一帧的位移是从动画中读取出来,再应用到角色上的,这样就能达到动画和位移的完美匹配了。
在Legacy中添加Root Motion功能
了解了Root Motion的概念之后,在Unity3D引擎中我们很简单就可以实现此功能了。Unity3D有一个统一的对象层次结构设计,这点非常赞,我们可以很简单找到角色的根骨骼,然后把其中的Transform变换读取出来,请见以下示例代码:


//-- 计算当前帧的Root Motion
    Vector3 rootPos = m_rootBone.localPosition;
    m_rootMotion = rootPos - m_lastRootPos;
    m_lastRootPos = rootPos;
    rootPos.x = 0;
    rootPos.z = 0;
    m_rootMotion.y = 0;
    m_rootBone.localPosition = rootPos;
请注意,我们在后续的代码中要把m_rootMotion附加的角色对象上,所以m_rootBone的postion被reset了。
在读取了此帧的Root Motion,在可以把它应用到当前对象之上了:
//-- Apply Root Motion
  Vector3 nextPos = this.transform.position + m_rootMotion;
        this.transform.position = nextPos;
另外,一个细节需要处理一下,在动画循环的那一帧,需要特殊处理一下。好的,看一下完整的源代码吧:
using UnityEngine;
using System.Collections;
public class ApplyRootMotion : MonoBehaviour
{
  public Transform m_flagObject;   // 用来测试位置的一个对象
  //-- Root Motion 控制变量
  Transform m_rootBone;
    Vector3 m_lastRootPos;
    Vector3 m_rootMotion;
    int m_lastAnimTime;
  void Start ()   {
    //-- 从SkinnedMeshRenderer中读取Root Bone
    SkinnedMeshRenderer skinMesh = this.gameObject.GetComponentInChildren<SkinnedMeshRenderer>();
  m_rootBone = skinMesh.rootBone;
  //-- 变量初始化
  m_rootMotion = Vector3.zero;
  m_lastRootPos = m_rootBone.localPosition;
  m_lastAnimTime = 0;
  }  
  void Update ()   {
    //-- Apply Root Motion
    Vector3 nextPos = this.transform.position + m_rootMotion;
  this.transform.position = nextPos;

  //-- 测试代码:更新测试物体的位置
  Vector3 flagPos = m_flagObject.position;
  flagPos.x = nextPos.x;
  flagPos.z = nextPos.z;
  m_flagObject.position = flagPos;
  //-- 测试代码:更新摄像机
  Camera.main.transform.LookAt(this.transform);
  }
  void LateUpdate()    {
    AnimationState animState = this.animation["walking"];
    if ((int)animState.normalizedTime > m_lastAnimTime)    {
    //-- 动画循环处理
    m_lastRootPos = m_rootBone.localPosition;
    m_rootMotion = Vector3.zero;
  }  else  {
    //-- 计算当前帧的Root Motion
    Vector3 rootPos = m_rootBone.localPosition;
    m_rootMotion = rootPos - m_lastRootPos;
    m_lastRootPos = rootPos;
    rootPos.x = 0;
    rootPos.z = 0;
    m_rootMotion.y = 0;
    m_rootBone.localPosition = rootPos;
  }
  m_lastAnimTime = (int)animState.normalizedTime;
    }
}

最后是截图。。。好吧,静态图片看不出效果,可以下载完整Demo(请使用Unity 4.6版本打开),角色移动非常平滑.



QQ截图20150210202215.png

Unity动画系统深度解析:从Animation到Animator的避坑指南 在Unity游戏开发中,动画系统是角色与场景交互的核心技术之一。其原理基于关键帧插值与状态机管理,通过骨骼蒙皮或顶点变换实现模型动态效果。该技术的价值在于提升游戏沉浸感与交互反馈,广泛应用于角色移动、UI动效、过场动画等场景。本文聚焦Unity新旧两套动画系统的核心差异,针对常见的'Animation未包含SetBool定义'报错,深入剖析Legacy Animation组件与Mecanim Animator控制器的底层机制与适用场景。通过对比代码示例与状态机设计,帮助开发者理解动画参数驱动、状态转换条件等 阅读详情

相关推荐

3ds Max蒙皮与Unity骨骼动画全流程解析:从建模到游戏驱动的标准化实践

在三维计算机图形学和游戏开发领域,骨骼动画是实现角色动态表现的核心技术。其原理是通过一套由关节和骨骼组成的层级结构(即骨架)驱动模型网格的顶点变形,从而模拟出生物或机械的运动。这项技术的核心价值在于将艺术创作(模型、动作)与程序逻辑(状态机、交互)高效连接,是实现角色动画可控、可复用的基础。在游戏、影视、虚拟现实等应用场景中,一套从数字内容创作(DCC)工具到实时渲染引擎的标准化工作流至关重要。本文聚焦于解决3ds Max与Unity3d之间的角色动画管线协同挑战,深入探讨了蒙皮权重绘制、FBX数据导出、H

weixin_34293141的博客 516

【Unity动画系统】详解Root Motion动画在Unity中的应用(二)

Root Motion最主要是解决动画,而不是位移,那么我们应该把移动的控制权从root Motion中拿回来(RigidBody主要用来模拟各种物理计算)。private void OnAnimatorMove(){ //启用后Unity不再用直接用Root Motion来驱动游戏对象,调用时间在FixedUpdate和动画系统的各回调方法之后,物理引擎计算之前Move();//如果希望精准运动的话,就将currentSpeed赋值给rig,不过这里动画和移动可能会有细微不同步。

weixin_60154963的博客 2732

了解Unity编辑器之组件篇Mesh(三)

了解Unity编辑器之组件篇Mesh

falsedewuxin的博客 5755

滑步处理 - 让动画脚步和移位一致

游戏制作中,通常的做法是让动画播放跑步或者其他移动动画,然后让刚体跟着移动,这样就会出现不匹配现象,看起来角色看起来像滑冰一样。Unity的动画本身有一个叫做ApplyRootMotion的东西,我么可以利用他让人物移动看起来一脚一个脚印的行走。我们的制作原理就是把动画移动的位移数据获取到,然后利用这个位移信息进行移动。

thinbug的专栏 6396

Unity动画的RootMotion

本文旨在快速引导新手熟悉Unity动画的RootMotion,达到在项目开发中可以迅速上手的目的。

平常心 949

R语言dlnm包避坑指南:手把手教你配置交叉基矩阵(附温度分层与滞后多项式设置)

本文详细介绍了R语言dlnm包在配置交叉基矩阵时的实用技巧与避坑指南,特别针对温度分层与滞后多项式设置提供了具体参数配置建议。通过解析`crossbasis()`函数的核心参数、温度分析的分层策略以及不同基函数的适用场景,帮助研究者高效构建分布滞后非线性模型,避免常见错误并优化模型性能。

weixin_34094282的博客 399

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

in place原地动画:也就是不带位移的动画root motion根运动动画:也就是自带“根位移”的动画这种所谓自带“根位移”的动画能够带来的好处是显而易见的,它有效地避免了角色动画和实际位移不同步的现象。比如我们经常可能会出现的滑步问题。humanoid。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4868

推荐系统在音乐领域的实践:网易云音乐推荐算法解析

你是否有过这样的经历?打开网易云音乐,“私人FM”里总能推到你想听的歌;“每日推荐”的歌单,往往藏着你没听过但一入耳就爱上的曲目。这些“懂你”的推荐背后,是一套复杂却精密的推荐系统在运转。问题陈述:音乐推荐的难点远超一般商品——音乐是高度主观的艺术,用户兴趣易随心情、场景变化;小众音乐的“长尾效应”显著,如何让冷门好歌被发现?传统协同过滤依赖历史行为,面对新用户/新歌曲的“冷启动”问题束手无策;而单纯的内容推荐又难以捕捉用户的隐性兴趣。核心方案:网易云音乐采用“混合推荐策略”——融合协同过滤(CF)

AI天才研究院 2085

Unity游戏开发之游戏动画(Root Motion以及动画文件)

即自带根位移的动画,有效避免了角色动画和实际位移不同步的现象。

Elsa的迷弟 2753

网络层隧道技术之ICMP隧道(pingTunnel/IcmpTunnel)

目录 ICMP隧道 使用ICMP搭建隧道(PingTunnel) 使用ICMP搭建隧道(Icmptunnel) ICMP隧道 ICMP隧道简单实用,是一个比较特殊的协议。在一般的通信协议里,如果两台设备要进行通信,肯定需要开放端口,而在ICMP协议下就不需要。最常见的ping命令就是利用的ICMP协议,攻击者可以利用命令行得到比回复更多的ICMP请求。在通常情况下,每个ping命令都有相...

谢公子的博客 6695

【智能车Code review】——环岛的判定与补线操作

【1】效果展示图 状态1、状态2 状态3 状态4、状态5 状态6 状态7 状态8 【2】状态机设定需要的参数 以右环岛为例: k_left:左线的斜率 rou_of_left:左线的方差 last_rou_of_left:上一帧的左线方差 l_start:左线第一行为黑的所在行 right_turn_down; right_turn_middle; right_turn_up; 左线的下、中、上拐点 fiv_width[i]:第i行的赛道宽度 leftline_du

hanhan的博客 2万+

Unity3D的Legacy动画系统中应用Root Motion

http://blog.csdn.net/neil3d/article/details/41724705 在动画时间内计算每帧动画的位移,即父节点的localPosition 把此位移给transform.position 最后处理一下循环动画,即用AnimationState.normalizedTime来控制 using UnityEngine; using System.Collec

517

Open3D 计算点云法向量的夹角【2026最新版】

计算法向量的夹角,博客长期更新,本文最新更新时间为:2026年3月7日。

点云侠的博客 3129

Unity3D角色动画驱动链路:从Animator状态机到Root Motion的排查指南

Unity3D角色动画是连接数字模型与交互体验的关键技术,其核心在于网格、骨骼、蒙皮及动画资源的协同驱动。在实际开发中,许多开发者会碰到角色原地踏步、动画切换异常等问题,根源往往在于Animator状态机配置不当或Root Motion与代码位移相互叠加。理解动画系统的运行原理,不仅能帮助开发者按正确顺序配置从模型导入到控制器搭建的完整流程,还能精准定位资源层、控制器层、逻辑层中的各类隐患。无论是在第三人称游戏、俯视角小游戏还是虚拟仿真项目中,这套基于Animator与CharacterController

weixin_29008055的博客 174

从代码仓库到知识库:自动化构建与RAG技术实践

在软件工程领域,代码库的规模与复杂性日益增长,如何高效管理和利用其中的知识成为关键挑战。传统文档工具主要依赖注释提取API信息,而现代知识构建技术则通过抽象语法树(AST)解析、自然语言处理等手段,深入理解代码结构、调用关系和业务逻辑。其核心价值在于将非结构化代码转化为机器可理解、可检索的结构化知识,显著提升代码资产的可维护性和团队协作效率。这一过程通常涉及代码解析、信息提取、向量化表示和存储索引四个关键阶段,其中向量化技术将代码语义转化为高维向量,为语义搜索奠定基础。结合检索增强生成(RAG)架构,开发者

weixin_42545292的博客 411

【ComfyUI专栏】ComfyUI 常用工作流下载与分享网址

首先我们来分享第一个网站,Openart 网站,这个网站同时也能提供比较多的其他类型。但是如果希望下载工作流,我们可以访问到如下的这个站点。作为ComfyUI的学习用户来说,我们通常需要借助他山之石来帮助我们快速成长,因此我们需要找到能够分享和下载的网址。,当前网站是综合性网站,在网站中可以下载各种不同的类型,其中工作流只是可以下载的非常小的部分。这个网站也可以浏览不同的工作流,这个工作流的地址和访问如下的站点。

技术与管理的平衡木- 7782

Unity动画系统笔记

人物向左、右走的动画无法在z轴对准正前方的同时向正左、右方移动。如果想按下A键让人物朝正左侧移动,应该选Original。

Jesui的博客 1729

无迹卡尔曼滤波 (UKF, Unscented Kalman Filter) 算法详解及案例分析

无迹卡尔曼滤波是一种用于估计非线性系统状态的递归算法。其目标是通过结合系统模型和观测数据,估计系统的最优状态。

闲人编程的博客 2625

动画系统 关于动画系统的根运动RootMotion

【原文参考】http://blog.csdn.net/neil3d/article/details/41724705   动画将控制RootBone对象的坐标、旋转、比例等,不合适的称为根运动吧   此脚本,就是将RootBone对象的坐标、旋转、比例等映射到父对象上,产生根运动的效果,不会出现感觉滑帧的情况出现   参考脚本: using UnityEngine; using Sy

Champion_Lee的专栏 1332

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Unity动画系统全链路优化:从资源导入到运行时性能提升实战指南

在实时3D应用开发中,动画系统是构建沉浸式体验的核心组件,其性能直接影响帧率与交互流畅度。其工作原理基于骨骼蒙皮、状态机与混合树等技术,通过对顶点变换的逐帧计算驱动模型运动。优化动画系统的技术价值在于显著降低CPU/GPU开销,提升应用在移动端、VR/AR等多平台下的稳定性和兼容性,尤其在处理复杂模型或同屏多角色时至关重要。常见应用场景包括游戏角色动作、工业模型展示、虚拟现实交互等。本文聚焦Unity引擎,针对Mecanim系统,深入解析动画资源导入规范、Animator Controller设计原则及运行

djph26741的博客 368

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

unity 以共享骨骼的形式实现换装功能

unity 以共享骨骼的形式实现换装功能

weixin_47819574的博客 5971

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Unity动画☀️四、动画导入的三种模式:Legacy、Generic 与 Humanoid

动画导入的三种模式:Legacy、Generic 与 Humanoid

星河造梦坊 1万+

unity Animation Legacy快捷设置工具

unity Animation Legacy快捷设置工具 上码 (注意:上面有2张资源图片,需要放在Editor Default Resources文件夹下) using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; public class AnimationLegacy { static Texture2D AnimationLegacy_A;//按钮图片1

思玉 579

【Unity】使用RootMotion跟运动驱动NavMeshAgent导航

【Unity】NavMeshAgent与Animator及RootMotion的配合 Unity目前(2019.4)还没有内置开箱即用的将导航与动画整合的方案,这里提供了一个将NavMeshAgent和Animator整合的思路,并且兼容了RootMotion。 实现NavMeshAgent和Animator整合时,主要需要解决滑步问题和NavMeshAgent与RootMotion的数据同步问题,在不同的使用情境下,这两个问题有不同的解决方案。 如果是不带RootMotion的角色,需要避免角色滑步,将角

Arvin的博客 4400
上一篇: Unity3D游戏开发之动画混合与动画重定向
下一篇: Windows系统Unity3D中的快捷键
七大黍
博客等级 码龄20年 436粉丝 260原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值