# XHFramework
**Repository Path**: xframework886/xhframework
## Basic Information
- **Project Name**: XHFramework
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-02-12
- **Last Updated**: 2026-02-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 🎯 大家感兴趣的话可以进入QQ群一起交流学习!
## 🎯 QQ交流群:621790749
# XHFramework - Unity 游戏客户端框架
XHFramework 是一个模块化的 Unity 游戏客户端框架,采用 **AOT层(固定核心)+ 热更层(动态业务)** 的双层架构设计。框架集成了 HybridCLR(代码热更新)和 YooAsset(资源热更新),实现了不发版本即可更新游戏逻辑和资源的能力。
## 一、核心技术栈
- **Unity** — 游戏引擎
- **HybridCLR** — C# 代码热更新(基于 IL2CPP 的补充元数据方案)
- **YooAsset** — 资源管理与热更新
- **Protobuf (Google.Protobuf)** — 网络序列化协议
- **Luban** — 配置表生成工具
- **UniTask** — Unity 异步编程框架(替代协程)
- **Newtonsoft.Json** — JSON 序列化
## 二、项目目录结构
Assets/
├── XFramework.Boot/ # 启动模块(AOT层)—— 游戏入口、资源更新、代码热更
├── XFramework.Core/ # 🏗️ 核心框架(AOT层)—— 15个管理器子系统
│ ├── Base/ # 框架入口 FW.cs、管理器基类 ManagerBase.cs
│ ├── Audio/ # 音频管理
│ ├── DataNode/ # 数据节点(树形数据存储)
│ ├── DataTable/ # 数据表管理(Luban配置表)
│ ├── Entity/ # 实体管理(游戏对象生命周期)
│ ├── Event/ # 全局事件系统
│ ├── Fsm/ # 有限状态机
│ ├── Http/ # HTTP短连接
│ ├── Localization/ # 多语言本地化
│ ├── Log/ # 日志系统
│ ├── Map/ # A*寻路系统
│ ├── Network/ # 网络通信(TCP/UDP/WebSocket)
│ ├── ObjectPool/ # 对象池
│ ├── ReferencePool/ # 引用池(轻量级对象复用)
│ ├── Resource/ # 资源管理(YooAsset集成)
│ ├── Scene/ # 场景管理
│ ├── Setting/ # 游戏设置
│ ├── Singleton/ # 单例基类
│ └── UI/ # UI框架(UGUI)
├── XFramework.Game/ # 🎮 游戏业务逻辑(热更层)—— 可热更新的业务代码
│ └── HotUpdateScripts/ # 热更脚本(Game.cs入口、各种Config、场景逻辑等)
├── XFramework.Editor/ # 🔧 编辑器工具
├── XFramework.Third/ # 📦 第三方库封装
└── XFramework.Unity/ # 🎨 Unity原生资源(场景、预制体、配置文件等)
## 三、框架启动流程(Boot 模块)
### 3.1 启动入口 —— Boot.cs
Boot.cs (MonoBehaviour,挂在启动场景的 GameObject 上)
Awake()
│
└── 禁用 Unity 默认日志(Debug.unityLogger.logEnabled = false)
Start() [async]
│
├── ① FW.Init(gameObject) → 初始化框架,注册所有15个AOT层管理器
├── ② new YooAssetService() → 创建资源服务
├── ③ new HybridClrService() → 创建热更服务
├── ④ 实例化 PatchWindow → 显示更新界面(进度条、错误提示)
├── ⑤ yooAssetService.InitializeAndUpdate() → 资源版本检查 + 下载更新资源
├── ⑥ hybridClrService.StartHybridCLRUpdate() → 加载AOT元数据 + 热更DLL
├── ⑦ hybridClrService.EnterMainEntry() → 通过反射调用热更层 Game.Start()
└── ⑧ 销毁 PatchWindow → 更新完成,进入游戏
Update()
│
└── FW.Update(deltaTime, unscaledDeltaTime) → 每帧轮询所有管理器
OnDestroy()
└── FW.Shutdown() → 关闭并清理所有管理器
### 3.2 热更层入口 —— Game.cs
当 HybridCLR 加载完热更 DLL 后,通过反射调用 XFramework.Game.Game.Start():
Game.Start() [async]
│
├── ① PreloadDataTable() → 加载所有 Luban 配置表(实体表、本地化表、音乐表等)
├── ② InitHotUpdateConfigs() → 初始化热更层配置
│ ├── UIConfig.InitUI() → 注册UI组(Background、Normal、Dialog、Tips等)
│ ├── AudioConfig.InitAudio() → 注册音频组(Music、Sound、UISound)
│ ├── EntityConfig.InitEntity() → 注册实体组
│ ├── NetworkConfig.InitNetwork() → 配置TCP/UDP/WebSocket通道
│ └── HttpConfig.InitHttp() → 配置HTTP基础URL和Token
├── ③ PreloadLoadLocalization() → 初始化多语言系统(设置语言类型、数据获取委托)
├── ④ LoadScene(1) → 切换到游戏主场景
├── ⑤ 加载地图资源 + 寻路数据
└── ⑥ 加载角色资源
### 3.3 BootConfig 配置
public static class BootConfig
{
public static readonly string packageName = "DefaultPackage";
public static readonly string packageUrl = "http://192.168.1.167:8084/XFramework/Res/";
public static readonly string hotUpdateDllName = "XFramework.Game.dll"; // 热更DLL名
public static readonly string hotUpdateEntryScript = "XFramework.Game.Game"; // 热更入口类
public static readonly string hotUpdateEntryMethod = "Start"; // 热更入口方法
}
#### ✨ 核心设计洞察
- 为什么用双层架构? AOT层(XFramework.Core)编译后不可变,保证框架稳定性;热更层(XFramework.Game)通过 HybridCLR 可以随时更新业务逻辑,无需重新发版。
- 反射调用热更入口:HybridCLR 加载 DLL 后,通过 Assembly.GetType().GetMethod().Invoke() 调用 Game.Start(),这是 AOT 层和热更层的桥梁。
- PatchWindow 的事件驱动设计:通过 OnStepChange、OnDownloadProgress、OnError 等事件回调,将更新进度反馈给 UI,实现了更新逻辑和 UI 显示的解耦。
## 四、核心架构设计(FW 静态门面)
### 4.1 FW.cs —— 框架中枢
FW 是整个框架的静态门面类(Facade Pattern),维护所有管理器的注册、轮询和销毁。
#### 核心数据结构
- LinkedList m_Managers —— 按优先级排序的管理器链表,用于 Update 轮询
- Dictionary m_ManagerDict —— 类型到实例的映射,用于快速获取管理器
#### 15 个 AOT 层管理器(按优先级从高到低)
| 优先级 | 管理器 | 职责 |
|--------|----------------------|-------------------------------|
| 150 | SettingManager | 游戏设置、帧率、游戏速度
| 140 | DataNodeManager | 树形数据节点存储
| 130 | DataTableManager | Luban 配置表管理
| 120 | LocalizationManager | 多语言本地化
| 120 | PathFindingManager | A* 寻路
| 110 | ResourceManager | 资源加载与管理(YooAsset)
| 100 | EventManager | 全局事件总线
| 90 | ObjectPoolManager | 对象池管理
| 85 | HttpManager | HTTP 短连接
| 80 | NetworkManager | 网络通信(TCP/UDP/WS)
| 60 | UIManager | UI 界面管理
| 60 | FsmManager | 有限状态机
| 50 | AudioManager | 音频管理
| 40 | EntityManager | 实体管理
| 30 | SceneManager | 场景管理
#### 管理器注册流程(RegisterManager)
RegisterManager()
├── 检查是否已存在(字典查重)
├── Activator.CreateInstance(typeof(T)) → 反射创建实例
├── 注册到 m_ManagerDict 字典
├── 按 Priority 插入 m_Managers 链表(优先级高的排前面)
└── 调用 manager.Init() 初始化
#### 轮询与关闭
- **Update()**:按链表顺序(优先级从高到低)轮询所有管理器
- **Shutdown()**:按链表逆序(优先级从低到高)关闭所有管理器,最后清理引用池
### 4.2 ManagerBase —— 管理器基类
public abstract class ManagerBase
{
public virtual int Priority => 0; // 优先级,越高越先被轮询,越后被关闭
public abstract void Init(); // 初始化
public abstract void Update(float elapseSeconds, float realElapseSeconds); // 每帧轮询
public abstract void Shutdown(); // 关闭清理
}
#### ✨ 核心设计洞察
- 为什么用 LinkedList 而不是 List? 因为管理器注册时需要按优先级插入到正确位置,LinkedList 的插入操作是 O(1),而 List 的中间插入是 O(n)。
- 为什么关闭顺序是逆序? 高优先级的管理器(如 ResourceManager)可能被低优先级的管理器(如 SceneManager)依赖,所以先关闭低优先级的,确保依赖关系不被破坏。
- 热更层动态注册:通过 m_ManagerDict 字典和 GetManager() 方法,热更层可以动态注册和获取自定义管理器,扩展框架能力。
## 五、核心子系统详解
### 5.1 资源管理系统(ResourceManager)
**优先级:110** | 集成 YooAsset
资源管理是框架最核心的模块之一,负责所有资源的加载、缓存和释放。
#### 四种资源组
| 资源组 | 说明 | 释放策略 |
|---------------------------------|--------------------------------|------------------------------|
| NormalResourceGroup | 普通资源 | 延迟释放,超时后自动回收
| ResidentResourceGroup(Global) | 全局常驻资源(字体、通用图集等)| 永不释放
| ResidentResourceGroup(Scene) | 场景常驻资源 | 切换场景时释放
| TransientResourceGroup | 临时资源 | 加载后立即释放句柄
#### 内存管理策略
- 配置了内存压力阈值(ResourceMemoryConfig)
- 当内存超过阈值时自动触发资源释放
- 场景切换时自动清理场景级资源
#### 主要 API
// 异步加载资源
await FW.ResourceManager.LoadAssetAsync(assetPath, priority);
await FW.ResourceManager.LoadGameObjectAsync(assetPath, priority);
// 预加载常驻资源
await FW.ResourceManager.PreloadGlobalResidentAssetAsync(assetPath);
await FW.ResourceManager.PreloadSceneResidentGameObjectAsync(assetPath);
// 场景加载
await FW.ResourceManager.LoadSceneAsync(scenePath, loadMode, priority);
// 释放资源
FW.ResourceManager.Release(asset, delayTime);
### 5.2 UI 管理系统(UIManager)
**优先级:60** | 基于 UGUI
#### 核心概念
- **UIGroup(界面组)**:如 Background、Normal、Dialog、Tips,每个组有独立的深度范围
- **UIForm(界面基类)**:所有 UI 界面继承此类,拥有完整的生命周期
- **DepthFactor**:UIGroup 之间深度间隔 10000,UIForm 之间深度间隔 100,确保层级不冲突
#### UIForm 生命周期
Init(首次创建)
│
├── BindInit() → 自动绑定 UI 元素
└── OnInit() → 子类初始化逻辑
│
Open(每次打开)
│
└── OnOpen() → 子类打开逻辑
│
├── Pause() ←→ Resume() → 被上层界面覆盖时暂停/恢复
├── Cover() ←→ Reveal() → 被遮挡/恢复可见
└── OnUpdate() → 每帧轮询
│
Close(关闭)
│
└── OnClose() → 子类关闭逻辑
│
Recycle(回收到对象池)
#### UIForm 初始化时的自动处理
// Init 方法中自动完成:
_cachedCanvas = gameObject.GetOrAddComponent