Appearance
动画系统
核心一句话
Unity 动画系统不是“播放一段动画”而已,它是一套:
c
Animation Clip -> Animator Controller -> State Machine -> Animator -> GameObjectAnimation Clip 存动作,Animator Controller 管动作之间怎么切换,Animator 挂在物体上真正播放,代码通过参数控制它。
五个核心概念
Animation Clip:动画片段。 比如 Idle.anim、Run.anim、Jump.anim、Attack.anim。它记录某些属性随时间变化:位置、旋转、缩放、Sprite、颜色、骨骼、组件字段。
Animation Window:制作和编辑动画的窗口。 路径是:
c
Window > Animation > Animation你可以选中物体,点 Create 创建动画片段,然后打关键帧。
Animator Component:挂在 GameObject 上的组件。 它负责真正播放动画。没有 Animator,动画控制器不会驱动物体。
Animator Controller:动画状态机资产。 里面有 Idle、Run、Jump、Attack 等状态,以及状态之间的过渡线。
Parameters:代码和 Animator 沟通的变量。 常见四种:
c
Float:Speed,适合速度、方向、混合值
Bool:IsGrounded,适合是否在地面、是否奔跑
Trigger:Attack、Jump,适合一次性动作
Int:WeaponType,适合武器类型、状态编号最小实战:Idle 和 Run
假设你有两个动画:
c
Idle.anim
Run.anim在 Animator Controller 里:
c
Entry -> Idle
Idle -> Run
Run -> Idle添加参数:
c
Speed,类型 Float过渡条件:
c
Idle -> Run:Speed > 0.1
Run -> Idle:Speed < 0.1代码这样写:
c
using UnityEngine;
public class PlayerAnimationController : MonoBehaviour
{
private Animator animator;
private Rigidbody2D rb;
private void Awake()
{
animator = GetComponent<Animator>();
rb = GetComponent<Rigidbody2D>();
}
private void Update()
{
float speed = Mathf.Abs(rb.linearVelocity.x);
animator.SetFloat("Speed", speed);
}
}这样角色速度大于 0.1 就跑,速度小于 0.1 就回到待机。
Transition 过渡要看什么
状态切换线叫 Transition。重点看这些:
c
Has Exit Time:是否必须等当前动画播到某个时间点才能切
Exit Time:退出时间
Transition Duration:混合时间
Conditions:切换条件移动动画通常关闭 Has Exit Time,因为你希望按下方向键马上从 Idle 切 Run。攻击动画通常开启或谨慎设置,因为你可能希望攻击动作播完再回 Idle。
Trigger 适合一次性动作
攻击、受击、跳跃、死亡,常用 Trigger:
c
public void Attack()
{
animator.SetTrigger("Attack");
}Animator 里可以这样:
c
Any State -> Attack
条件:Attack TriggerAny State 表示无论当前在 Idle、Run、Jump,都可以立刻切到 Attack。死亡、受击、攻击很常见。
Blend Tree 是什么
如果只有 Idle 和 Run,用普通状态就行。 如果你有:
c
Idle
Walk
Run就适合用 Blend Tree。
它根据一个参数连续混合动画:
c
Speed = 0 -> Idle
Speed = 1.5 -> Walk
Speed = 5 -> Run2D 游戏八方向移动也常用 2D Blend Tree,用:
c
MoveX
MoveY来混合上、下、左、右、斜方向动画。
Root Motion
Root Motion 的意思是:角色位移由动画本身推动。
c
Apply Root Motion 开:动画带着角色移动
Apply Root Motion 关:代码/物理控制角色移动,动画只负责姿势新手做 2D 平台跳跃、俯视角移动,通常先关掉 Apply Root Motion,用代码控制移动。3D 写实角色、动作游戏、过场动画里 Root Motion 更常见。
Animation Event
动画事件可以在某一帧调用函数。
例如攻击动画砍到中间时才造成伤害:
c
public void AttackHit()
{
Debug.Log("真正造成伤害");
}然后在 Attack.anim 的命中帧添加事件,调用 AttackHit()。
适合:
c
脚步声
攻击命中
播放特效
发射子弹
开门声音不要把复杂游戏逻辑全塞进 Animation Event,它更适合“跟动画时间点强相关”的小事件。
最常见坑
c
有 Animation Clip,但物体没挂 Animator
Animator 没指定 Controller
参数名字拼错,比如 Speed 写成 speed
Trigger 用成 Bool,导致攻击一直重复
移动动画 Has Exit Time 没关,导致反应慢
Transition Duration 太长,动作软绵绵
2D Sprite 动画忘记设置 Loop Time
攻击判定写在动画开始,而不是命中帧
Root Motion 开着,代码又在移动角色,二者打架学习路线
1. 会创建 Animation Clip
2. 会用 Animation Window 打关键帧
3. 会创建 Animator Controller
4. 会做 Idle / Run 状态切换
5. 会用 SetFloat / SetBool / SetTrigger
6. 会用 Blend Tree 做移动混合
7. 会用 Animation Event 做命中帧
8. 再学 Layers、Avatar Mask、Root Motion、IK记住这句就稳了:
c
Clip 存动作,Controller 管状态,Parameter 做条件,Animator 挂物体,代码只改参数。参考:Unity 官方 Animation overview、Animation Clip、Animation Window、Animator Controller、State Machine、Transitions、Blend Trees、Root Motion。