本次发布的全新动画 AnimGraph Sample 构建了全新的角色移动(Locomotion)动画框架,整合了 Facing Warp、Stride Warping、Distance Matching 等关键节点。该框架能够在运行时将角色朝向与物理运动解耦,并通过动态调节下肢跨步间距、基于空间位移精确驱动动画帧,以及符合物理状态的自然姿态偏移,使角色在全向移动、起停切换与快速变向等场景下呈现更真实、更稳定且更具控制力的运动表现。
在通常游戏的开发流程中,角色移动系统的构建长期面临灵活性与真实感难以兼得的技术约束。若采用以胶囊体驱动配合动画状态机的常规方案,动画通常仅按照固定时间轴及混合参数播放,难以与角色实际的物理位移保持严格一致,进而容易产生滑步等问题。为缓解这一矛盾,开发者往往会引入根运动(Root Motion)来接管角色位移。该方案虽然能够从机制上减少滑步现象,但也会同步削弱系统的运行时可控性与灵活性。
本次推出的 Locomotion 框架,正是针对上述痛点所作出的优化。通过使用上述节点,系统在保留胶囊体驱动所带来的高响应性与高扩展性的基础上,实现了动画姿势与跨步表现的实时校准。由此,角色即使在动态变化下,也能够呈现接近甚至优于传统根运动方案的运动一致性与视觉真实感。
欢迎体验 AnimGraph Sample
丨体验步骤
为获得最佳游戏体验,请使用 Tuanjie Editor 1.9.0 或更高版本。
1. 下载或克隆本项目:
git clone https://cnb.cool/tuanjie/Animation/AnimGraph_Sample2. 使用 团结引擎 打开该项目,引擎版本需为 1.9.0 或以上。
3. 打开Assets/AnimGraph_Sample/AnimGraph_Sample.scene场景文件。
关键技术
丨朝向扭曲
朝向扭曲(Facing Warp)节点功能的主要作用是在保持角色上半身朝向的同时,动态调整下半身的移动方向。在传统的动画系统中,通常需要制作八个方向的移动动画并配合 BlendTree 使用,容易在过渡时出现脚步交叉或穿模。
通过配置 Facing Warp节点,在运行时节点通过读取计算出的速度矢量与控制朝向的夹角差,在骨骼链上分布旋转扭曲,从而使用较少的动画实现自然的全向移动效果。
![]()
步幅扭曲
步幅扭曲(Stride Warping)允许开发者动态调整角色迈步的物理跨度,使其在播放过程中动态地匹配动态变化的胶囊体移动速度。在传统的动画系统中,如果游戏逻辑修改了角色的移动速度,若只调整动画播放速率来适配,会导致角色出现“滑步”或由于频率过快导致的“小碎步”。
Stride Warping 节点通过计算“期望速度”与“动画 Root Motion 速度”的比值,动态拉长或缩短角色腿部的跨步距离,从而使角色步幅适配不同的移动速度。
![]()
距离匹配
距离匹配(Distance Matching)节点的核心作用,在于将动画播放的驱动逻辑由传统的“时间轴驱动”转变为“空间位移驱动”。它能够根据角色实际移动距离动态匹配动画进度,从而有效保证起步、急停和快速变向等场景下,脚步动作与物理位移在时间和空间上的一致性。使用距离匹配首先需要在动画 Inspector 上勾选 lockToRoot 来生成一根距离曲线,有了距离曲线之后后续节点会通过采样曲线数值来计算出实际的位置。
动画通常依赖时间轴播放,常常导致胶囊体已停止但脚步还在滑动。该功能需与基于物理预测逻辑配合使用:实时计算出角色静止所需的预测停止距离,节点则据此直接跳转至对应的动画帧,确保角色移动表现与物理空间位移的一致性。并引入了基于距离数据的动画序列评估器,支持查询并直接输出动画曲线中与距离标记相匹配的帧姿态,可有效解决角色滑步问题。
距离匹配需要在 Animation Graph 中通过 AnimationEvaluator Node 进行计算,不同于 Animaiton Clip Node,Evaluator 只能通过设置精确时间来采样姿态,姿态更新需要通过在右侧的 Binding Functions 栏目里根据需要执行的频率不同来在不同的细分类别中添加函数来进行驱动(如果全局只需要执行一次则在 Init Binding Functions 中添加,如果每帧都需要执行则在 Update Binding Functions 栏里添加,如果每次进入状态执行一次则在 Became Revalent Binding Functions 里添加),每个函数需要给定一个 AnimEvaluator 格式的入参,不能有输出参数。
![]()
实际运行时可以通过 Distance Match To Target 和 Advance Time By Distance Matching 两个函数节点来控制 Evaluator Node 的时间。前者通过给出指定距离,计算出当前角色位置向前移动指定位置到达停止的距离,通过这个距离来设置当前角色姿态,保证角色移动指定距离后可以停止。后者则通过给出指定距离,计算出角色当前姿态向前移动指定距离后的新姿态,用来控制角色前行。通过两个函数配合,可以精确控制角色的起步和停步,有效避免滑步。
![]()
惯性混合
在团结引擎 1.9.0 的 AnimGraph 中,惯性化(Inertialization)是一项用于优化动画过渡体验的技术。下面的视频展示了角色在转身跑状态快速切换动画的惯性混合:
该节点基于当前姿态的运动趋势,在较短时间内对骨骼位姿变化进行平滑补偿,使角色在状态切换、动作打断或快速响应输入时,依然能够保持运动惯性与视觉连续性。相比传统的硬切换或依赖大量过渡动画的方式,惯性化能够显著减少姿态跳变等问题,让动画切换看起来更加自然、流畅且符合真实物理直觉,极大程度地保持过渡目标动画的运动特性。
![]()
动画切换和动画叠加
AnimGraph 现在已支持运行时切换动画,可以在 Binding Function 中通过 SetAnimationClip 等节点切换动画,Apply Additive 也已支持 BlendTree。
![]()
下面的视频演示了角色切换蹲下、行走和跑步的三种状态动画的切换以及根据摄像机旋转角度的速率来倾斜角色以达到更好的真实感。
Unity 官方微信
第一时间了解Unity引擎动向,学习进阶开发技能
每一个“点赞”、“在看”,都是我们前进的动力
![]()
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.