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. 安装与最初的五分钟