Game_Num_Basics_And_Calc

🎬 技能动画管线:从 Animator Event 到可视化时间轴

在动作游戏与 RPG 开发中,技能释放不仅仅是播放一个 Animation Clip。它涉及到复杂的时序同步:第 0.1秒 播放音效,第 0.3秒 生成特效,第 0.4秒 开启伤害判定框,第 0.8秒 允许输入打断。

如何优雅地维护这些时序逻辑?本文档对比了传统方案与工业化方案,并提供最佳实践。


1. 传统方案:Animation Events

Unity 原生支持在 Animation Clip 的特定帧插入 Event,调用挂在同一个 GameObject 上的函数。

1.1 工作流

  1. 打开 Animation 窗口。
  2. 在第 20 帧右键 -> Add Animation Event
  3. 填写函数名 OnHit 和参数 1.0
  4. 代码中实现 void OnHit(float damageMultiplier) { ... }

1.2 致命缺陷 (The “Traps”)

结论: 仅适用于简单的原型或纯视觉反馈(如脚步声)。严禁用于核心战斗逻辑(伤害、状态切换)。


2. 进阶方案:State Machine Behaviours (SMB)

利用 Unity Animator 的 StateMachineBehaviour 脚本,绑定在 Animator Controller 的 State 上,而非 Clip 内。

2.1 工作流

  1. 在 Animator 窗口选中 “Attack_Slash” 状态。
  2. 点击 Add Behaviour -> 新建脚本 SkillState.
  3. 利用 OnStateEnter, OnStateUpdate, OnStateExit 钩子。

2.2 优缺点


3. 工业级方案:可视化时间轴编辑器 (Visual Timeline Editor)

这是目前 3A 及大型独立游戏(如 Hades, God of War)的主流做法。核心思想是将技能看作一个序列 (Sequence),而非单纯的动画。

3.1 架构核心

技能不再是一个函数,而是一个 ScriptableObject(我们称之为 SkillSequence)。它包含多条轨道(Track):

3.2 实现路径

A. 使用 Unity Playable API + Timeline

Unity 内置的 Timeline 功能强大,但原生主要用于过场动画 (Cutscene)。

B. 自研轻量级编辑器 (推荐)

基于 EditorWindow 开发一个类似 Timeline 的 GUI。

3.3 为什么它更优雅?

  1. 确定性 (Determinism): 逻辑完全由时间驱动,不依赖动画系统的混合状态。即使模型丢失、动画卡住,伤害判定依然会准时触发。
  2. 可视化 (Visualization): 策划可以直观地看到:伤害是在刀光特效出现的 0.1秒 后触发的。
  3. 热重载: 可以在 Play Mode 下拖动时间轴上的滑块,实时调整手感(例如修改前摇时间),无需重编译。
  4. 健壮性: 所有的配置都是强引用的 Asset,不会因为改了函数名而崩坏。

4. Vampirefall 落地建议

鉴于项目类型(塔防+肉鸽),技能系统主要用于防御塔怪物

推荐方案:轻量级帧事件系统

不需要做完整的 Timeline 编辑器,性价比最高的是 “Animation Curve + ScriptableObject”

  1. 配置: 在技能 SO 中定义关键帧时间点。
    • FireTime: 0.5s (发射投射物时间)
    • BackswingTime: 0.8s (后摇结束,可进行下一次攻击时间)
    • TotalDuration: 1.2s (动作总时长)
  2. 预览: 写一个简单的 Editor 脚本,在 Scene View 中根据当前选中的帧,画出怪物的 Hitbox 范围,方便对齐。
  3. 执行: 使用 Coroutine 或 Timer 在代码中严格执行上述时间点,动画仅作为视觉表现配合逻辑播放,而不是逻辑驱动动画。

黄金法则: Logic Drives Animation, Never the Other Way Around. (逻辑驱动表现,永远不要反过来。)