首页/ 第 9 章 · 动画系统/ 第 142 课
LESSON 142 · 动画系统

动画控制器脚本控制(SetTrigger 等)

动画代码控制已掌握。下一课学 IK 反向动力学。

⏱ 约 14 分钟📊 难度:入门🗂 第 9 章 · 动画系统📍 第 142 / 300 课
课程进度
142 / 300

🎯本节学习目标

  • 掌握 Animator 常用 API
  • 实现参数驱动的状态切换
  • 掌握播放/暂停控制

🚀课程导读

前几课零散用了 SetFloat/SetBool,本课系统整理 Animator 的代码控制全家桶。

Animator 核心 API

一套方法走天下。

  1. 【获取】private Animator anim; void Awake() { anim = GetComponent<Animator>(); }
  2. 【Float】anim.SetFloat("Speed", value); anim.SetFloat("Speed", value, damp, deltaTime);(平滑)
  3. 【Int】anim.SetInteger("State", 1);
  4. 【Bool】anim.SetBool("IsWalking", true);
  5. 【Trigger】anim.SetTrigger("Attack"); 触发一次性动作;anim.ResetTrigger("Attack"); 手动复位。
  6. 【读取】float s = anim.GetFloat("Speed"); bool b = anim.GetBool("IsWalking");
  7. 【当前状态】anim.GetCurrentAnimatorStateInfo(0)(层 0);检查是否在某状态:stateInfo.IsName("Walk")。
  8. 【状态归一化时间】stateInfo.normalizedTime:动画播放进度(>1 表示循环过一轮)。
  9. 【播放/暂停】anim.speed = 0f(暂停)/ 1f(正常);anim.Play("StateName") 强制播放指定状态。
  10. 【层】anim.SetLayerWeight(1, w);(第 136 课)。
💡
核心心法:参数是“开关”,Set 系列是“拨开关”,状态机负责“看开关换动画”。

实战:完整角色动画控制

组合使用。

  1. 在角色移动脚本里整合:
  2. float speed = new Vector3(h, 0, v).magnitude;
  3. anim.SetFloat("Speed", speed, 0.1f, Time.deltaTime); // 平滑
  4. anim.SetBool("IsGrounded", grounded);
  5. if (Input.GetKeyDown(KeyCode.Space) && grounded) { anim.SetTrigger("Jump"); }
  6. if (Input.GetMouseButtonDown(0)) { anim.SetTrigger("Attack"); }
  7. 【状态机配合】Speed>0.1 走路、IsGrounded=false 跳跃、Attack 触发攻击。
  8. 【动画完成回调】攻击结束回到待机:状态机的攻击→待机过渡(Has Exit Time 播完)即可,无需代码。
  9. 【打断】攻击中想被受击打断:Any State → Hit(第 131 课)。
  10. 【调试】把 anim 参数打出来确认在变:Debug.Log(anim.GetFloat("Speed"));
  11. 【注意】SetTrigger 需状态机有对应过渡才生效;状态名与参数名要一致。
完整角色动画 = SetFloat 速度 + SetBool 状态 + SetTrigger 动作 + 状态机配合。一套齐活。

常见错误与排查

错误:攻击动画播不完就切走?
原因:过渡条件太快或 Has Exit Time 未配置
解决:攻击→待机过渡勾选 Has Exit Time;或调整条件逻辑。

动手练习

课后小任务(做出来才算真的学会)

  • 用代码完整驱动移动/跳跃/攻击动画
  • 用 anim.Play 强制播放某个状态
  • 用 anim.speed=0 实现动画暂停

本节小结

动画代码控制已掌握。下一课学 IK 反向动力学。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课2D 动画(Sprite Animation)