首页/ 第 16 章 · 性能优化/ 第 274 课
LESSON 274 · 性能优化

项目架构(单例/事件/对象池)

项目架构完成。下一课做代码规范。

⏱ 约 15 分钟📊 难度:入门🗂 第 16 章 · 性能优化📍 第 274 / 300 课
课程进度
274 / 300

🎯本节学习目标

  • 掌握架构思想
  • 实现事件系统
  • 实现管理器模式

🚀课程导读

“项目一大了就乱”——架构是“不乱”的关键。本课搭一套可扩展架构。

架构思想

分层与职责。

  1. 【分层】游戏代码分层:
  2. 管理层(GameManager/AudioManager/UIManager)
  3. 数据层(SaveSystem/PlayerStats/Config)
  4. 逻辑层(角色/敌人/技能组件)
  5. 表现层(动画/特效/UI 表现)
  6. 【职责单一】每个脚本只干一件事(PlayerStats 管数值、PlayerMove 管移动)。
  7. 【通信】管理层用单例、对象间用事件、配置用数据。
  8. 【单例】全局唯一管理器(第 86 课):GameManager/AudioManager/UIManager。
  9. 【事件】解耦对象通信(第 167 课)。
  10. 【数据驱动】配置用 ScriptableObject/JSON(第 85 课)。
  11. 【好处】改一处不影响全局、新功能易加、别人易看懂。
  12. 【注意】别“上帝脚本”(一个脚本管所有)。
  13. 【完成】架构思想“有了”。
  14. 【推荐】小项目也按“管理/逻辑/表现”分层。
💡
架构三原则:分层(管理/逻辑/表现)、单一职责、解耦(事件/数据)。

事件系统实现

“谁出事通知谁”。

  1. 【简单事件】每个系统自己声明事件(第 167 课):
  2. public event System.Action<int> OnScoreChanged;
  3. 【全局事件系统】跨系统解耦:
  4. public static class GameEvents {
  5. public static event System.Action<int> OnScoreChanged;
  6. public static event System.Action OnPlayerDied;
  7. public static void ScoreChanged(int s) => OnScoreChanged?.Invoke(s);
  8. public static void PlayerDied() => OnPlayerDied?.Invoke();
  9. }
  10. 【发布】加金币:GameEvents.ScoreChanged(newScore);
  11. 【订阅】UI:GameEvents.OnScoreChanged += UpdateScore;
  12. 【取消订阅】OnDestroy 时 -=(防泄漏,重要!)。
  13. 【好处】金币系统不需要“知道”UI 存在(解耦)。
  14. 【注意】订阅不取消 = 内存泄漏(重要坑)。
  15. 【实战】把项目的分数/死亡通知改用事件。
  16. 【完成】事件系统“通了”。
  17. 【进阶】UnityEvent/委托参数化(进阶)。
订阅事件必须 OnDestroy 取消订阅(-=),否则对象销毁后仍被调用=泄漏/报错。

常见错误与排查

错误:事件重复触发?
原因:重复订阅没取消
解决:订阅时先 -= 再 +=(防重复);OnDestroy 统一 -=。

动手练习

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

  • 用单例管理核心系统
  • 实现全局事件系统
  • 重构一个模块用事件解耦

本节小结

项目架构完成。下一课做代码规范。

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

← 上一课优化综合练习:性能达标