客户端启动模块 private
客户端启动模块
目标与边界
本模块把 Unity 场景变成可运行的游戏:创建 Zenject 容器、加载文本配置、安装 ECS/网络/视图系统、选择 Single/CsClient/ClientTest 模式,并在每帧驱动 IGameMain。
真实入口
- Assets/Main/MainLauncher.cs:根 Installer 与模式选择。
- Assets/Main/MainInstaller.cs:配置加载、依赖注入、Factory 注册。
- Assets/Main/Client/ClientGameMain.cs、Assets/Main/HostClient/HostClientGameMain.cs、Assets/Main/Server/CsClientGameMain.cs:运行模式。
- Assets/Code/Game/OGame/GameInstaller.cs:游戏逻辑安装。
启动链路
sequenceDiagram
participant U as Unity
participant L as MainLauncher
participant I as MainInstaller
participant M as Main
participant G as IGameMain
U->>L: InstallBindings
L->>I: 注入配置和服务
I->>I: GameInstaller/NetworkInstaller/LogicInstaller
U->>M: 构造并注册消息
M->>G: 根据模式创建 GameMain
loop 每帧
M->>G: Tick
G->>G: Systems.Execute/Cleanup
end
核心代码
_networkSettings = AMF.AssetManager.Instance.GetAsset<NetworkSettings>(
"GConfig/NetworkSettings", AMF.ASSETTYPE.TEXT);
Container.Bind<INetworkSettings>()
.To<NetworkSettings>().FromInstance(_networkSettings);
NetworkInstaller.Install(Container);
LogicInstaller.Install(Container);
Container.BindFactory<ObjectType, ClientGameMain, ClientGameMain.Factory>();
Main 只持有当前的 IGameMain:
public void Tick() => _gameMain?.Tick();
_gameMain?.Dispose();
_gameMain = null;
Zen.WorldManager.Instance.Clean();
新增一个运行模式
- 新建实现 IGameMain 的类,构造时初始化对应 systems。
- 在 MainInstaller.InstallBindings 注册 Factory。
- 在 Main.GameMode 增加枚举值并接入创建分支。
- 在 Dispose 中释放网络、资源和 ECS context。
- 在 Unity Editor 跑一次进入/退出流程,确认 Console 无异常。
验收
- editor/state 的 is_compiling=false。
- 启动无 MissingReferenceException。
- 进入游戏后 systems 连续执行,退出后 WorldManager.Clean 被调用。