1. 你会得到什么
Common Game System 是什么、它为你的项目提供的 23 个服务,以及它有意省略的内容。
1.1 Common Game System 是什么?
Common Game System(CGS)是面向 Unity 6.3 LTS 的 C# 基础框架。它以 23 个开箱即用的服务的形式,为你的项目提供每个游戏都需要的底层设施——存档、音频、输入、场景加载、定时器、补间动画等。
全部 23 个服务在你按下 Play 时自动启动。一个引导(bootstrap)组件会在你的第一个脚本运行之前完成它们的注册。没有任何东西需要拖进场景,也没有任何东西需要配置。你的代码只需索取服务并使用它:
[SerializeField] private AudioClip clickClip;
private void OnButtonClicked()
{
var audio = ServiceLocator.Resolve<IAudioService>();
audio.PlaySfx(clickClip);
}
CGS 是纯代码的。它不在屏幕上绘制任何东西,也不强加任何美术风格、题材类型或项目结构。你继续按自己喜欢的方式写游戏;CGS 负责底层的机械部分。
1.2 它解决的问题
大多数 Unity 项目都以同样的方式开始:一个 “Managers” 文件夹。从上个项目复制来的 SaveManager。凭记忆重写的 AudioManager。一个管理时间缩放的单例、一个负责淡入淡出的辅助类、一个写了一半的对象池。每一个都要在每个项目里重写一遍,很少经过测试,而且每次的接线方式都不一样。
CGS 就是那个文件夹的成品版。每个服务都是:
- 一致的。 每个服务都通过同一个定位器、以同样的方式获取。学会这个模式一次,就等于会用全部 23 个服务。
- 经过测试的。 框架附带 2,600+ 个自动化测试。你可以自行导入并运行它们(见第 3 章)。
- 有文档的。 每个服务在包内
Documentation/Modules/下都有自己的参考页——同样的参考也以本站服务参考的形式在线提供。 - 可替换的。 每个服务都位于一个接口之后。你可以换上自己的实现,或者用一行代码把某个服务整个关掉(见下文 1.4 节)。
1.3 23 个服务一览
每个服务都是一个接口。下面的表格按它们为你的游戏做的事情分组。每个服务名都链接到它的完整参考页。
存档与设置
| 服务 | 它为你做什么 |
|---|---|
ISaveService | 带命名槽位的 JSON 存档文件。写入是原子性的,因此崩溃永远不会损坏已有存档。 |
IConfiguration | 类型化的设置组(音量、图形选项等),跨会话持久保存。 |
IAchievementService | 本地玩家统计与成就。当统计值越过阈值时,成就自动解锁。 |
输入与 UI
| 服务 | 它为你做什么 |
|---|---|
IInputService | 通过命名动作映射(“Gameplay”、“Menu”)读取手柄和键盘输入,支持交互式按键重绑定。 |
IInputKeyMapSource | 提供输入动作资产,并存储玩家的重绑定更改。 |
IPanelStack | 压入和弹出 UI 面板(菜单、对话框),并让手柄和键盘焦点始终停留在正确的面板上。 |
ILocalizationService | 按键查找显示文本,并可在运行时切换语言——无需重启。 |
音频、场景与资产
| 服务 | 它为你做什么 |
|---|---|
IAudioService | 通过 AudioMixer 播放音乐、音效和语音,支持按通道控制音量。 |
ISceneService | 异步加载场景,支持加载画面、取消操作,以及叠加(additive)加载与卸载。 |
IAddressableSceneService | 加载位于 Addressables 内容中、而非构建列表中的叠加场景。 |
IAssetProvider | 加载 Addressables 资产并进行引用计数,只有在无人再使用某个资产时才释放它。 |
计时与运动
| 服务 | 它为你做什么 |
|---|---|
ITimeService | 为游戏玩法、UI 和后台工作提供各自独立的时钟。暂停或减慢游戏玩法的同时,菜单动画照常播放。 |
IScheduler | 定时器:延迟一段时间后执行、按固定间隔执行或下一帧执行。也可以把工作调度到主线程运行。 |
ITweenService | 用 31 种缓动曲线随时间对任意值做动画。游戏暂停时,补间也随之暂停。 |
ITweenSequenceService | 把补间串联成顺序或并行的时间线,比如一段包含多个步骤的开场动画。 |
逻辑与工具
| 服务 | 它为你做什么 |
|---|---|
ILogger | 分类、可过滤的日志,取代散落各处的 Debug.Log 调用。 |
IEventBus | 类型安全的发布与订阅。系统之间通过事件而非直接引用交流。 |
IDeferredBus | 现在把事件排入队列,稍后在你指定的时机投递——在加载或过场动画期间很有用。 |
IObjectPoolService | 复用预制体实例(子弹、粒子),而不是每次都创建再销毁。 |
IRandomService | 带种子、带命名流的随机数。结果可复现,并且在存档和读档之后保持一致。 |
IStateMachineService | 为 AI 或游戏流程构建简单状态机,支持进入、退出和转换规则。 |
IPushdownStackService | 管理嵌套的游戏状态——例如叠在游戏玩法之上的暂停界面,之后再干净地移除。 |
ICommandRegistry | 面向开发者控制台和作弊指令的运行时命令注册表。控制台 UI 由你提供;包内附带一个可用的示例。 |
1.4 每个服务都有开关
每个服务都附带一个“空”孪生实现:接受所有调用但什么都不做的版本。如果你的项目已经有音频方案,一行代码即可关掉 CGS 的那一个:
ServiceLocator.Replace<IAudioService>(new NullAudio());
框架的其余部分继续正常工作。所有与音频服务对话的代码仍然能编译、能运行——只是输出的是静音。同样的一行开关适用于全部 23 个服务,同样的机制也允许你换上自己的实现而不是空实现(第 7 章列出了完整清单)。
1.5 CGS 不是什么
预先了解边界能为你省下时间:
- 没有游戏玩法内容。 没有角色、背包、伤害公式或关卡。CGS 提供机制;内容由你的游戏提供。(一个小型 RPG 形态的示例展示了这些部件如何组合。)
- 没有渲染。 CGS 不包含着色器、材质或管线代码。它在 URP、HDRP 和内置管线下的表现完全一致。
- 单机、面向 PC。 CGS 面向 Windows、macOS 和 Linux 上的单机游戏。没有网络层,也没有移动或主机平台的适配工作。
1.6 环境要求
- Unity 6.3 LTS。 CGS 基于 Unity 6.3 LTS 构建并测试。
- 三个常见的 Unity 包,均为可选。 Input System 包(供输入服务使用)、uGUI(供 UI 面板栈和演示场景使用)和 Addressables(供资产与可寻址场景服务使用)。Input System 和 uGUI 随新建的 Unity 项目自带,而导入本包时会通过其依赖列表自动安装缺失的部分——包括 Addressables——因此大多数用户无需手动安装任何东西。
CGS 被拆分为七个程序集。核心程序集承载 18 个服务,除 Unity 本身外不依赖任何东西。其余程序集各自包装一个可选包。如果你移除某个包——比如 Addressables——对应的 CGS 程序集会安静地把自己排除在编译之外。框架的其余部分照常编译和运行;而如果 uGUI 不在了,UI 面板栈会退化为一个安全的空操作服务。你永远不会因为缺少某个可选包而看到满屏错误。完整的程序集地图见第 7.1 章。
下一章:2. 安装与最初的五分钟