Unity动画系统

LiFasT
LiFasT
Published on 2025-07-08 / 31 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