用途
unity-architecture 用于解决 Unity 项目中常见的“单体 MonoBehaviour 蜘蛛网”问题:脚本之间通过 GetComponent、FindObjectOfType 或静态单例互相引用,导致修改一处逻辑就连带破坏 UI、音频和存档系统。该技能提供一套以 ScriptableObject 为核心、事件驱动解耦、单一职责组件为手段的架构模式,帮助项目在扩展时保持可维护性。
主要能力
ScriptableObject 架构
用 ScriptableObject 资产存储共享游戏状态(如生命值、弹药、分数),替代可变的静态单例。资料给出了 FloatVariable 示例。事件方面,通过 GameEvent 资产在调用方与监听方之间广播事件,避免直接耦合;GameEvent 内部维护 GameEventListener 列表,提供 Raise、Register、Unregister 方法。
解耦组件架构
将数千行的巨型控制器拆分为单一职责组件,例如 PlayerInputReader(输入转移动向量)、PlayerMotor(CharacterController 物理)、PlayerHealth(伤害计算并触发事件)、PlayerAudioFeedback(监听生命事件并播放音效)。子系统交互通过接口隔离,如 IDamageable、IInteractable。
RuntimeSet 动态实体跟踪
用 RuntimeSet<T> ScriptableObject 替代 FindObjectsOfType:实体生成时把自己加入集合,销毁时移除;系统查询集合为 O(1),无 GC 分配,也不遍历场景树。
DOTS/ECS 扩展
面向对象架构用于高层玩法、菜单和任务;当同时模拟超过 5000 个活跃实体(如弹幕、蜂群、体素地形)时,建议使用 Unity DOTS(Entities、IJobEntity、Burst Compiler)。
使用方式
资料以“四步模式”组织:第一步建立 ScriptableObject 变量与事件;第二步按单一职责拆分组件并用接口隔离;第三步用 RuntimeSet 做实体发现;第四步在需要规模时引入 DOTS。交付物为一个解耦的 ScriptableObject 事件系统:GameEventListener 组件挂到需要响应事件的对象上,在 OnEnable 时注册、OnDisable 时注销,事件触发时调用配置的 UnityEvent。资料还给出一次 Boss 战重构示例:把 BossAI 对 PlayerController、UIManager、CameraShake、AudioManager、SaveSystem 的直接引用替换为 OnBossPhaseChanged 和 OnBossDied 两个 ScriptableObject 事件,UI、相机、音频、存档各自注册为独立监听器,BossAI.cs 从 1420 行降到 310 行,并消除了场景重载时的引用错误。
适用场景
适合需要长期维护和扩展的 Unity 项目,尤其是 UI、音频、存档、Boss 战等跨系统交互频繁的模块;也适合需要跟踪大量动态实体或进行大规模模拟的项目在架构选型时参考。
限制
资料未说明该技能的安装方式、运行平台、版本兼容性、收费模式或具体使用步骤,这些信息暂未提供。资料主要给出架构原则、示例代码和验证清单,实际落地需要开发者自行结合项目调整。