第三十课:角色状态机与动画切换
上一课你会画 Idle、Walk、Attack、Hurt;剪得越多,越容易乱——攻击中能不能跳?受击要不要打断走?死亡还能不能按移动?
状态机就是给答案:每个「身份」只准做几件事,身份之间怎么换,得写清楚。
像电梯:关门 → 到站开门 → 超时再关门。角色也一样,只是状态换成 Idle / Walk / Attack。
1、先把「身份」列出来
小项目够用的一套:
| 状态 | 大约播什么 | 常能切到 |
|---|---|---|
| Idle | 待机循环 | Walk、Jump、Attack、Hurt |
| Walk / Run | 走 / 跑循环 | Idle、Jump、Attack、Hurt |
| Jump(可再拆起跳 / 腾空 / 落地) | 空中几帧 | Attack(空中)、Hurt、落地回 Idle |
| Attack | 上一课那段非循环 | Idle、Walk、Hurt(可打断) |
| Hurt | 受击短非循环 | Idle、Die |
| Die | 倒地 | (通常结束) |
每个状态对应一段剪辑(或一组剪辑)。图上标着 RUNNING,就是引擎里 play("run") 那种东西——名字跟状态对齐,后面查找不会疯。
俯视角还常乘方向:Idle×8、Walk×8……仍然是「状态 + 朝向」,别当成几百个互不相干的动画。
扩展状态(需要再加):Dash、Guard、Crouch、Climb、Cast……别一上来全做,先跑通四五个核心。
2、转换:谁允许变成谁
转换靠条件,不是随便跳:
| 条件 | 例子 |
|---|---|
| 输入 | 按攻击 → Attack |
| 动画播完 | Attack 结束 → Idle |
| 物理 | 脚离地 → JumpAir;落地 → Idle |
| 伤害 | 被打 → Hurt(闪避无敌可挡) |
| 资源 | HP≤0 → Die |
最小合法表(只记主干):
Idle ──方向──► Walk ──松键──► Idle
│ │
│攻击 │攻击
▼ ▼
Attack ──播完──► Idle / Walk
任意(有伤)──► Hurt ──播完──► Idle
任意(HP=0)──► Die
非法的别开:死了还 Walk、Hurt 里再开大招又不取消、Attack 前摇就能瞬切到第二招……除非你明确设计成取消规则。
优先级常见从高到低:Die > Hurt > Attack / Dash > Jump > Walk > Idle。同时满足多个条件时,走高的。
3、切过去:硬切还是糊一下
像素游戏大多 硬切(新状态第一帧立刻上),手感更快。
想少突兀:让相邻状态的起止剪影接近(Attack 收招 ≈ Idle 起手),必要时插 1~2 帧过渡,别做成十几帧 blend 糊掉反馈。
跳跃里「上升 ↔ 下落」之间常有一帧 Invert / 过顶——Y 速度翻转时当桥。这就是状态(或子状态)边界:Up → Invert → Fall,别指望一段无限循环自己搞定。
取消(Cancel):攻击后摇里允许闪避 / 跳跃——高手手感;别在每一帧都允许,否则会砍掉「后摇代价」。
4、动画事件:和玩法绑在同一帧
状态决定「播哪段」;事件决定「这一帧干什么」:
| 时机 | 常见事件 |
|---|---|
| 攻击帧开始 | 开 Hitbox、播挥刃音、出第28课特效 |
| 攻击帧结束 | 关 Hitbox |
| 闪避起手 | 开无敌;结束关无敌 |
| 动画最后一帧 | 允许切回 Idle / 接连招窗 |
Attack 状态全程:输入先进 Attack → 播非循环 → 中间帧开判定 → 播完退回 Idle(或接下一连)。别把 Hitbox 挂在「一按攻击键就永久开」上。
Hurt / Die 优先级高:正在 Attack,被打也可能硬切——除非当前帧处于超级装甲。Die 一般不再接受移动输入。
5、复合:同时发生怎么办
有时表面像两个动作:一边跑一边开枪。
两种做法选一,写进设计:
- 新状态:
RunShoot(单独剪辑,表更长、最清晰) - 分层:下半身 Run + 上半身 Shoot(省帧,实现稍烦)
别让代码里「半个 Run、半个 Shoot」却没有任何状态名——以后 Debug 会哭。
引擎里:Godot 可用 AnimationTree / 自写 enum;Unity 用 Animator 参数(Bool / Trigger)。先在纸上画通,再拖节点。一句话实现:change_state 时检查白名单 → 换 play(动画名) → 在 animation_finished 退回。
6、作业
给自己的角色定一套能用的状态机:
- 状态清单:至少 6 个(含 Idle / Walk / Attack / Hurt),各写一句干什么
- 转换表:谁 → 谁,触发条件一句话;圈出非法路径
- 状态机小图:纸笔或 Draw.io 都行
- Attack 事件表:哪几帧开 / 关 Hitbox、特效、音效、结束允许转换
- 选做:引擎里跑通
Idle → Walk → Attack → Idle,被打能进 Hurt
下一课做 NPC / 敌人——玩家状态机更贪,对面的人常常更省、但 AI 要换一套剪辑节奏。
课程作者:像素熊老师
微信公众号「教你画像素画」 · B站 · X / Twitter · GitHub