Unity 客户端运行架构:分层入口 private
Unity 客户端运行架构:分层入口
本篇只建立客户端全貌。Logic、Rendering 和 Editor 扩展已经拆成独立二级页,具体问题直接进入对应页面。
1. 客户端的四层
flowchart TB
Editor[Editor 扩展<br/>场景/配置/资源/构建] --> Assets[运行时资产与生成代码]
Bootstrap[启动与装配<br/>ClientProxy / Zenject] --> Logic[Logic<br/>Entity / Actor / System / Rule]
Assets --> Bootstrap
Logic --> Render[Rendering<br/>GameObject / Animator / VFX / UI]
Net[Network<br/>Login/Lobby/Battle] <--> Logic
| 层 | 负责 | 不负责 | 深入阅读 |
|---|---|---|---|
| 启动与装配 | 初始化顺序、资源、配置、World、系统注册 | 具体玩法规则 | 11 客户端启动模块 |
| Logic | 状态、规则、System、移动/HP/刷怪意图 | 材质、动画、Inspector | 23 客户端 Logic |
| Rendering | Prefab、View、Animator、VFX、UI、位置表现 | 服务端权威和最终业务判定 | 24 客户端 Rendering |
| Editor | 地图/配置/资源制作、生成、检查、构建 | Player 运行逻辑 | 25 Unity Editor 扩展 |
当前源码目录有历史混合,文档分层是责任分层,不代表目录和程序集已经完全解耦。
2. 启动顺序
入口是 Assets/Code/ClientProxy.cs:
flowchart TD
A[ClientProxy.Awake] --> B[日志、任务、屏幕、质量]
B --> C[Common.Root.Initialize]
C --> D[AssetManager + Manifest]
D --> E[UIManager + 平台 SDK]
E --> F[本地化、URL、角色描述]
F --> G[UpdateManager]
G --> H[ConfigManager.LoadAllConfig]
H --> I[VFX、技能/Buff 工厂]
I --> J[MapAdapter.Initialize]
J --> K[NetworkManager.Init]
K --> L[UniqueWorld.OnCreate]
L --> M[预加载 + UI 场景]
M --> N[UILoginPanel]
地图、网络和 World 创建前,资源索引及首批配置必须可用。启动空引用先检查是否越过初始化边界。
3. 运行时核心
GameInstaller 用 Zenject 注册服务和 System。Entitas 使用四个 Context:
- Core:Hero、Monster、GPE、Bullet 等状态。
- Map:Spawner、Trigger、Portal、导航资源和地图事件。
- Network:连接、远端实体、快照和同步。
- GameObject:逻辑实体与 Unity 对象的桥接。
MapElement
-> MapEntity
-> CoreEntity
-> Actor/NetworkEntity
-> GameObjectEntity
-> View
前半段主要属于 Logic,最后两段属于 Rendering,Network 在两者之间提供跨端输入。
4. 三类容易混淆的“服务器”
| 名称 | 实际作用 |
|---|---|
| Login/Lobby/Battle | 真正的 .NET 游戏后端 |
| NetworkManager/BattleClient | Unity 内的网络客户端 |
| Jenny-Server.bat | Entitas 代码生成服务,不是游戏后端 |
Jenny 读取 Library/ScriptAssemblies/GameAssemblyNew.dll,根据 Component 生成 Assets/Code/Game/OGame/Generated。Unity 必须先编译成功,且生成目录不能手改。
5. 资源从 Editor 到 Runtime
flowchart LR
Excel[Excel] --> ConfigTool[ConfigOption]
Scene[地图场景] --> MapTool[Map Gather/Bake]
Prefab[Prefab/模型/纹理] --> Importer[AssetPostprocessor]
ConfigTool --> Config[配置代码和数据]
MapTool --> MapData[地图 bytes/Nav/Lightmap]
Importer --> Bundle[Addressables/AssetBundle]
Config --> Runtime[Client Runtime]
MapData --> Runtime
Bundle --> Runtime
Editor 工具产生运行时输入,但 UnityEditor API 不能进入 Player。地图和配置还可能同时产出服务端副本。
6. 按现象选择文档
| 现象 | 先看 |
|---|---|
| 启动卡住、服务未初始化 | 11 |
| 状态错、规则重复执行、切图后仍响应 | 23 |
| 实体存在但没有模型、动画或特效 | 24 |
| 菜单、Inspector、导入、生成或构建出错 | 25 |
| 玩家创建、出生点、输入和 Animator | 18 |
| NavMesh、Agent、Portal、移动策略 | 20 |
| 本地正常但远端错误、回滚或冲刺 | 22 |
| 登录后切 Lobby/Battle 失败 | 12 |
7. 客户端修改的最小检查
- 改规则:确认 Logic 状态、System 生命周期和网络权威。
- 改表现:确认 View 异步创建、对象池清理和本地/远端差异。
- 改 Editor:确认 Editor-only 程序集、可重复生成和产物版本。
- 改跨层接口:同时检查 CoreEntity、GameObjectEntity、IViewObject 和销毁流程。
- 改联机字段:客户端与 Battle 同批更新协议和配置。