客户端启动模块 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();

新增一个运行模式

  1. 新建实现 IGameMain 的类,构造时初始化对应 systems。
  2. 在 MainInstaller.InstallBindings 注册 Factory。
  3. 在 Main.GameMode 增加枚举值并接入创建分支。
  4. 在 Dispose 中释放网络、资源和 ECS context。
  5. 在 Unity Editor 跑一次进入/退出流程,确认 Console 无异常。

验收

  • editor/state 的 is_compiling=false。
  • 启动无 MissingReferenceException。
  • 进入游戏后 systems 连续执行,退出后 WorldManager.Clean 被调用。