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

动画层 Animation Layer

动画层已掌握。下一课学骨骼动画与绑定。

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

🎯本节学习目标

  • 理解动画层原理
  • 掌握创建动画层
  • 掌握 Avatar Mask 遮罩

🚀课程导读

“上半身挥剑、下半身同时走路”是很多游戏的需求。动画层(Layer)把身体拆成多层独立动画。

动画层原理

多个动画叠加播放。

  1. Animator 左侧有【Layers 层级】面板,默认有 Base Layer(基础层)。
  2. 【添加层】点层级面板的 + 号,新建一个 Layer(如 UpperBody)。
  3. 【权重】每层有 Weight(0-1):控制该层动画的混合程度。Base Layer 通常 Weight=1。
  4. 【合成】多层动画按权重叠加:下层走路 + 上层攻击 = 边走边攻击。
  5. 【Mask 遮罩】给上层设置 Avatar Mask:指定“哪些骨骼参与该层动画”。
  6. 【创建 Mask】Project 右键 → Create → Avatar Mask → 打开,勾选要控制的骨骼(上半身)。
  7. 【指定 Mask】在 Layer 的 Mask 槽里拖入 Avatar Mask。
  8. 【默认层】Base Layer 权重固定为 1,其他层默认 0(需代码开)。
  9. 【应用】上层做“攻击/挥手/拿枪”(Mask 上半身),下层做“走路/跑步”。
💡
动画层 = 身体分层:Base 管下半身移动,UpperBody 管上半身动作,用 Mask 拆开。

层权重代码控制

让上层“开/关”。

  1. Animator 的 Layers 面板每层有 Index(0=Base,1=UpperBody...)。
  2. 【权重】anim.SetLayerWeight(1, 1f); // 打开上层
  3. anim.SetLayerWeight(1, 0f); // 关闭上层
  4. 【平滑开关】用 Lerp 平滑过渡权重:
  5. anim.SetLayerWeight(1, Mathf.Lerp(anim.GetLayerWeight(1), 1f, Time.deltaTime * 10f));
  6. 【层内状态机】每层都是独立的状态机,有独立 Entry/Any State。
  7. 【写代码】在层状态机里给“攻击”状态设条件,进入攻击时开权重,退出时关。
  8. 【实战】按攻击键:Trigger 攻击 → 上层播攻击动画 → 权重平滑到 1 → 结束权重回 0。
  9. 【注意】Mask 不匹配时上层动画可能“不动”,检查 Mask 勾选范围。
  10. 【性能】层越多越耗,按需使用。
动画层 + 权重 = “局部动画”的标准做法,常见于 3D 动作游戏。

常见错误与排查

错误:上层动画没效果?
原因:权重为 0、或 Mask 没遮到对应骨骼、或层没设置好状态
解决:确认 SetLayerWeight 开了;Mask 勾选上半身骨骼;层内状态机有有效动画。

动手练习

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

  • 创建 UpperBody 层并设 Mask(上半身)
  • 在下层做走路、上层做攻击动画
  • 用权重代码实现“边走边攻击”

本节小结

动画层已掌握。下一课学骨骼动画与绑定。

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

← 上一课动画事件 Animation Event