animation-design-proposal.md 7.4 KB

动效系统设计方案

本文档用于整理当前项目后续的动画 / 动效建设方案,目标不是单纯“让界面更花”,而是把动画正式纳入现有架构,成为:

  • 状态感知工具
  • 空间注意力引导工具
  • 操作反馈工具
  • 节奏增强工具

当前系统已经具备:

  • 地图引擎
  • 规则引擎
  • telemetry
  • presentation
  • feedback

因此动画系统最合理的做法,不是零散补丁,而是按层管理、按事件驱动、按配置扩展。


1. 设计原则

后续动画建设建议遵循以下原则:

1.1 动画服务于玩法,不只是装饰

动画优先回答这些问题:

  • 现在发生了什么
  • 用户该看哪里
  • 这次操作是否成功
  • 当前节奏是在紧张、平稳还是危险

1.2 动画要分层

不要把所有动画都堆在页面层的 class 切换里。
后续应按:

  • 地图空间动画
  • HUD 动画
  • 反馈动画
  • 页面微交互动画

分层管理。

1.3 动画要和事件绑定

动画应该由事件或状态变化触发,而不是页面自己猜。

例如:

  • control_completed
  • control_skipped
  • guidance_state_changed
  • session_started
  • session_finished
  • heart_rate_zone_changed
  • gps_lock_changed

1.4 动画要支持降级

低端机和正式版都需要降级策略。
后续建议统一支持:

  • animationsEnabled
  • animationLevel = low / medium / high

2. 动画分层方案

2.1 地图空间动画

这一层最重要,也最贴玩法。

适合放在:

  • MapPresentation
  • MapScene
  • WebGL renderer

典型内容:

  • 当前目标点脉冲
  • 可打点状态强化
  • 已完成点过渡
  • 已跳过点灰态过渡
  • 地图 pulse
  • 危险区呼吸
  • 迷雾 reveal 扩散
  • 金币收集爆点
  • 幽灵感知圈变化

这一层的特点

  • 与地图空间对象绑定
  • 最不适合用 WXML 硬拼
  • 应由渲染层持续驱动

2.2 HUD 动画

这一层用于数值和状态提示,不直接改地图对象。

适合放在:

  • 页面层
  • HUD 组件层

典型内容:

  • 目标距离数字滑变
  • 进度数字跳变
  • 心率区间颜色过渡
  • 计时器关键时刻闪烁
  • 按钮状态点亮 / 失活过渡
  • 玩法专属状态块的显隐和强调

这一层的特点

  • 更适合 CSS / WXSS animation
  • 应避免过重
  • 高优先级字段可以做轻动画,避免全屏大动作

2.3 反馈动画

这一层最适合和声音、震动一起看,属于事件消费型动画。

适合放在:

  • FeedbackDirector
  • UIEffectDirector

典型内容:

  • 打点成功 toast
  • 警告 shake
  • 成功 burst
  • stage flash
  • 局部 pulse
  • 失败 / 结束反馈

当前已有雏形

目前系统已经有一些反馈类动效基础:

  • punchFeedbackFxClass
  • mapPulse
  • stageFx

这条线后续最值得继续系统化。


2.4 页面微交互动画

这一层优先级最低。

典型内容:

  • 按钮轻微过渡
  • 面板弹入弹出
  • 信息卡展开收起
  • 调试面板展开收起

原则

  • 可以做,但不要先重投入
  • 不要让它抢过地图和玩法本身的注意力

3. 当前最值得优先打磨的动画

如果要开始投入动画,我建议先做这 4 组。

3.1 打点成功动画体系

这是当前项目最值得优先打磨的一组。

建议包含:

  • 控制点本体状态变化
  • 地图局部 pulse
  • HUD 进度跳变
  • 成功提示 toast
  • 声音与震动协同

为什么优先

  • 高频
  • 用户感知强
  • 直接决定“打点有没有爽感”

3.2 目标点状态动画体系

建议把目标点的几种状态做清晰区分:

  • 未完成
  • 当前目标
  • 可打点
  • 已完成
  • 已跳过

每个状态至少应在:

  • 颜色
  • 脉冲
  • 强弱

上有明显区别。

为什么优先

  • 这是地图玩法的核心视觉语言
  • 对理解规则和空间注意力引导都很关键

3.3 锁定 / 自动转图状态动画

建议补强以下体验:

  • 开启 GPS 锁定时的吸附反馈
  • 锁定关闭时的提示
  • 自动转图切换时的更自然缓动
  • 特殊状态下的方向感提示

为什么优先

  • 当前地图交互已经很强
  • 这块稍微打磨就很有“专业感”

3.4 危险 / 高压状态动画

这条非常适合未来玩法扩展,尤其是:

  • 幽灵追逐赛
  • 心率驱动玩法
  • 高压任务模式

建议后续支持:

  • 边缘呼吸
  • 危险圈脉冲
  • 压力提示颜色递进
  • 节奏增强

4. 事件驱动建议

动画最好不要由页面层直接“看到状态变了就自己猜”,而应由事件或 presentation 状态明确驱动。

建议优先整理以下动画事件:

  • session_started
  • session_finished
  • session_cancelled
  • control_completed:start
  • control_completed:control
  • control_completed:finish
  • control_skipped
  • guidance_state_changed
  • gps_lock_changed
  • heart_rate_zone_changed
  • danger_state_changed

这些事件后续可以统一映射到:

  • sound
  • haptics
  • uiEffects
  • map animation

5. 配置化建议

后续动画不应只写死在代码里。
建议逐步走向 profile 化。

例如:

"game": {
  "feedback": {
    "uiEffectsProfile": "default-race",
    "mapAnimationProfile": "default-map"
  }
}

后续 profile 可承载的内容

  • 某类事件是否启用动效
  • 动效持续时间
  • 动效强度
  • 颜色风格
  • 是否允许低端机降级

6. 建议增加统一动画配置

建议后续统一支持:

"game": {
  "animation": {
    "enabled": true,
    "level": "medium"
  }
}

建议值:

  • enabled
  • level = low / medium / high

用途

  • 低端机降级
  • 调试关闭
  • 正式版保守

7. 技术落地建议

7.1 地图动画

应继续放在地图引擎和 renderer 内处理。

不要让页面层承担:

  • 点位 pulse
  • 区域 reveal
  • 轨迹闪动
  • 目标高亮

这些都更适合:

  • MapPresentation
  • MapScene
  • WebGL renderer

7.2 HUD 动画

适合继续放在页面层。

建议:

  • 尽量轻量
  • 尽量做过渡,不做大面积复杂动画
  • 高优先级字段做细微跃迁即可

7.3 反馈动画

应继续走:

  • FeedbackDirector
  • UIEffectDirector

这条线后续很适合继续统一:

  • 哪个事件触发什么动画
  • 持续多久
  • 是否叠加 sound / haptics

8. 实施顺序建议

不建议一口气铺太多动画。
推荐顺序:

  1. 打点成功动画体系
  2. 目标点状态动画体系
  3. HUD 数字与状态过渡
  4. 锁定 / 自动转图状态动画
  5. 危险 / 高压反馈动画
  6. 最后再做页面微交互动画

9. 第一阶段建议任务

如果下一步准备开始做动画,建议第一阶段先只收下面这些:

任务 1

整理一份动画事件字典:

  • 哪些事件会触发动画
  • 动画归属哪一层
  • 对应目的是什么

任务 2

把打点成功链系统化:

  • 点位变化
  • HUD 跳变
  • pulse
  • toast

任务 3

统一目标点状态动画:

  • 当前目标
  • 可打点
  • 已完成
  • 已跳过

任务 4

补一个动画总开关:

  • animationsEnabled
  • animationLevel

10. 当前阶段结论

当前项目已经具备做动画体系的基础。
最正确的方向不是继续零散补动效,而是:

  • 先按层组织动画
  • 再按事件驱动
  • 最后再做配置化和降级

一句话总结:

后续动画建设应以“打点成功”和“目标状态”两条高频体验为起点,把动画正式纳入现有架构,而不是继续做零散样式补丁。