Unity动画系统

LiFasT
LiFasT
Published on 2025-07-08 / 367 Visits
0
0

序

本文主要介绍Unity中的动画系统,包括但不限于Animator组件、AnimationController以及相关控制脚本。

本文参考于iHeartGameDev的系列教程视频

Animator

Animator是一个Unity内置组件,挂载在需要执行动画的对象身上

属性

说明

Controller

连接的 Animator Controller(动画状态机)

Avatar

模型的骨骼结构(仅 Humanoid 模型需要)

Apply Root Motion

是否应用动画中的位移/旋转到 GameObject(正常来说不需要)

Animate Physics

动画是否影响物理系统(搭配Update中的Fixed)

Update Mode

动画更新模式

Culling Mode

剔除模式,决定GameObject在摄像机外是否计算动画

  • Update Mode

Normal:在Update()周期内更新动画

Fixed:在FixedUpdate()周期内更新动画,与物理系统同步(不影响物理)

Unscaled Time:不受Time.timeScale影响,适合UI

  • Culling Mode

Always Animate:任何情况下都会持续计算

Cull Update Transforms:不计算骨骼动画、transform、ik等运动,但状态机和Root Motion持续运作

Cull Completely:完全停止动画

Animator Controller

Layers 动画层

Parameters 参数组(变量)

类型

用途说明

Float(浮点数)

适合表示速度、力度、方向等连续变化的数值

Int(整数)

用于需要整数判断的逻辑,比如动画阶段编号

Bool(布尔值)

最常用的类型,适合“跳不跳”“跑不跑”这种开关逻辑

Trigger(触发器)

类似按钮,一次性触发动画(如攻击、受击),设置后自动清除

使用案例

  • Float 使用场景

移动速度控制动画混合(如从站立过渡到跑步)

animator.SetFloat("Speed", moveSpeed);

  • Int 使用场景

控制角色当前姿态类型,例如:0=正常,1=战斗,2=防御

animator.SetInteger("State", 1);

  • Bool 使用场景

控制持续性状态,如“是否在地面”、“是否开火”

animator.SetBool("IsJumping", true);

  • Trigger 使用场景

控制一次性动画,如“攻击动作”或“受伤反应”

animator.SetTrigger("Attack");

animator.ResetTrigger("Attack");

状态机

三个特殊节点

节点

作用

Entry

状态机的初始入口,只用一次;接入第一个默认状态(如 Idle)

Any State

可从任意当前状态跳转,常用于中断类动作(攻击、受伤、死亡)

Exit

状态或子状态机的退出点;用于自动返回上级状态或结束当前动作

注:

  • Any State是单向的,要考虑进入后退出的状态转换

  • 每个Entry都必须设置一个默认状态

Transition 转移

Solo和Mute

  • Solo:当有多个转移满足时,只通过勾选Solo的转移

  • Mute:禁止勾选Mute的转移

Has Exit Time

表示动画是否要播放到一定程度才能切换。

  • 如果勾选:动画播放到一定百分比(Exit Time)后,才开始切换。

  • 如果不勾选:只要满足条件,就立即切换。

Exit Time

定义动画播放到多少才开始切换(仅在 Has Exit Time 被勾选时生效)。

  • 范围是 0 ~ 1,表示动画播放百分比。

  • 例如 0.75 表示动画播放到 75% 时触发切换。

Fixed Duration

控制过渡时间是按“秒数”计算,还是按动画的相对时间比例计算。

Transition Duration

切换花费的时间(单位是原状态动画的时间比例)

  • 通常是 0.1 ~ 0.25,表示从一个状态混合到另一个状态的过渡时间。

Transition Offset

设置目标动画从哪里开始播放(0~1)

  • 例如设置为 0.5 表示新动画从一半开始播放。

Interruption Source

Conditions

定义在什么情况下才允许进行过渡。

  • 条件由你在 Parameters 中定义的参数控制(Float、Bool、Trigger 等)。

  • 多个条件之间是“与”关系。

Blend Tree 混合树

Blend Tree 是 Animator Controller 中的一种特殊状态(State),它允许你基于一个或多个参数来动态混合多个动画,实现平滑自然的动画过渡。

Blend Type

Blend Type

解释

适合场景

1D

动画 Clip 会按 Threshold 值排布,线性插值

基于一个参数(如 Speed)

2D Simple Directional

根据方向混合,但忽略参数的大小(只看方向向量)

方向动画(左右前后)

2D Freeform Directional

根据方向和距离都参与混合,方向权重大,距离次之

复杂方向控制

2D Freeform Cartesian

将参数视为 X/Y 坐标,根据距离进行插值(和位置相关)

多动画细致混合

Direct

每个动画 Clip 有自己的参数权重值,不插值,只直接控制

精确手动控制(通常配合多个 Float)

动作重定向

动作重定向的本质

所有类人生物模型,只要其骨骼可以映射到 Unity 的标准 Humanoid Avatar 上,就可以共享所有基于 Humanoid 的动画。这种“重定向”是基于“抽象骨架结构”的动作转译系统,是一种标准化、接口化的动画解决方案。

只要某一角色的动作剪辑基于Humanoid,该角色的所有动作就成为 Unity 标准人形动作,可以无缝重定向到任意其他 Humanoid 角色。

角色重定向方法

  • 导入角色FBX

  • 将 Animation Type 设置为 Humanoid

  • 设置 Avatar Definition 为:Create From This Model

  • 点击 Apply

  • 点击 Configure 进入骨骼映射

  • 映射完成后点击 Done

image-vmsG.png

动作重定向方法

与上文角色重定向方法类似

  • 设置 Avatar Definition 为:Copy From Other Avatar

  • 设置 Source 为:已经重定向完成的角色Avatar


Comment