# Assets Hotfix ILRuntime Unity3D **Repository Path**: xiaobaichong/AssetsHotfix_ILRuntime_Unity3D ## Basic Information - **Project Name**: Assets Hotfix ILRuntime Unity3D - **Description**: 这是一款Unity 3D热更游戏框架。 - **Primary Language**: C# - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2023-05-09 - **Last Updated**: 2024-09-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: Unity ## README # Assets Hotfix ILRuntime Unity3D # 介绍 这是一款基于`ILRuntime`开发的热更框架,使用`ECS`模式驱动热更逻辑运行。 框架借鉴于`ET`框架设计理念和核心思想进行开发,并将其流程简单化。 开发者不需要重新去写一套繁琐和完整的热更框架,上手使用也是很轻松。 # C#热更基础架构 `HotfixMonoBehaviour` 是驱动`DLL`运行的脚本,将其挂载游戏对象上使其运行。(一般一个`Unity` 场景运行一个`DLL`逻辑)。 `Hotfix` 是热更`DLL`"心脏"。其依赖于`HotfixMonoBehaviour`"维持生命周期运行"。 `Game` 是`DLL`的整个世界,可以理解为造物主。 `Scene` 是世界中的一个舞台。只能有一个舞台是处于激活状态的。世界需要一个舞台才有意义。通过`Game.Instance.CreateScene`创建一个新场景,使用`Game.Instance.LoadScene`使场景运行起来。 `Entity` 是场景中的演员,场景中可包含多个实体,实体包含`Component`和`System`。 `Component` 是演员所需道具,表示数据。可使用`ComponentIDE`或`VariablesIDE`在Unity场景中配置数据。 `System` 是演员行为,表示逻辑。其脚本类似`MonoBehaviour`组件,有其事件生命周期函数。 `ComponentIDE` 可用于生成`Component`数据,使用`Entity.AddComponent(ComponentIDE componentIDE)`给实体添加数据。 `VariablesIDE` 可用于生成`Component`数据,使用`Entity.AddComponent(VariablesIDE variablesIDE)`给实体添加数据。(基于可视化代码实现) # AB包数据结构 `AssetBundles` 三个主要包: 1. code 热更`DLL`包: - `Hotfix.dll` 代码文件 - `Hotfix.pdb` 调试文件 2. configdata 数据配置包: - AudioConfig 音频数据配置 - ColorConfig 颜色数据配置 - PrefabConfig 预制件数据配置 - SpriteConfig 精灵数据配置 - TextConfig 文本数据配置 - TextureConfig 纹理配置 - VideoConfig 视频数据配置 3. configframework 游戏框架包: - MessageBubbleCanvas 消息弹出提示 - MessageBoxCanvas 类似Windows MessageBox - MessageNoticeCanvas 滚动 公告 - MessagePageCanvas 页面展示,文字,图片,用于图文阅读 - MediaCanvas 媒体画板-》包括视频,图片,文字,声音,模型 - CarouselCanvas-》轮播图,切换事件,点击事件,可拖拽,自动播放等功能 # 快上手 新建一个空场景 `MainScene`,在该场景创建一个 `UnityObject` 对象并命名为 `HotfixManager`,添加 `HotfixMonoBehaviour` 组件给该对象。 `HotfixMonoBehaviour` 组件会自动添加 `ComponentIDE` 组件。 ![](README/Img/HotfixMonoBehaviour面板.png) `ComponentIDE` 组件脚步名字段换成 `MainComponent`,此时可生成脚本按钮变成可点击状态。 `ComponentIDE` 支持四种数据配置: + 一般类型:可选择常用数据类型 + Unity 对象:可通过拖拽选择Unity Object类型。并可通过下拉列表显示该对象所有组件,选择并赋值 + 一般类型集合:是使用 `List<一般类型>` 的字段数据 + Unity 对象集合:是使用 `List` 的字段数据 最下面有个预览按钮,该功能可用于预览要生成的数据脚本。不同类型由分界线隔开。 我们现在给该组件添加一个 `int` 字段命名为 `age` 并赋值为18,表示如下: ![](README/Img/MainComponentIED_Age.png) 通过点击预览脚步可看到我们组件包含的数据 ![](README/Img/ComponentIED预览.png) 点击生成脚本后,会在目录下生成如下脚本 `Assets/Hotfix/Scripts/Component/MainComponent.cs`。 `Assets/Hotfix` 这个目录是热更DLL 目录,用于编写热更逻辑。 现在我们来创建热更相关代码。可供创建的脚本文件有四类: - Scene 创建一个舞台(一个逻辑场景) - Entity 创建一个演员(场景逻辑对象) - Component 演员所需道具(数据字段) - System 演员所演剧本(代码逻辑) ![](README/Img/创建Hotfix代码.png) 在 `Assets/Hotfix/Scripts/Scene` 目录下创建一个场景代码。 ``` Csharp namespace Hotfix { /// /// 场景(实体舞台) /// 描述 /// public sealed class MainScene : SceneBase { public override void OnInit() { this.AddEntity("MainScene"); } } } ``` 给该场景添加了一个 `MainEntity` 实体,我们需要在 `Assets/Hotfix/Scripts/Entity/` 目录下创建他。 ``` Csharp namespace Hotfix { /// /// 实体即为容器(个体) /// 描述 /// public class MainEntity : EntityBase { public MainEntity(string name) : base(name) { } public override void OnInit() { // 添加数据组件 this.AddComponent(Game.Instance.componentIDE); // 添加逻辑系统行为 this.AddSystem(); } } } ``` `Game.Instance.componentIDE` 这个就是上面 `componentIDE` 组件用来初始化数据的。 该实体需要我在 `Assets/Hotfix/Scripts/System/MainSystem.cs` 创建一个实体行为逻辑。 ```Csharp namespace Hotfix { /// /// 系统即为行为 /// 主实体行为 /// public class MainSystem : SystemBase { MainComponent data; public override void Awake() { data = entity.GetComponent(); } public override void Start() { Debug.Log("妹妹今年:" + data.age); } } } ``` 现在我们创建了一个逻辑场景,要使他执行起来,需要在 `Assets/Hotfix/Scripts/Init.cs` 入口加载该场景 ```Csharp namespace Hotfix { /// /// 热更初始化脚本 /// public static class Init { /// /// 程序初始化入口 /// public static void Start() { //创建场景 Game.Instance.CreateScene(); // 运行场景 Game.Instance.LoadScene(); } } } ``` OK 终于可以运行看效果了。点击运行看到打印日志。 由于当前是在 `Editor` 运行的,是直接加载Dll实现热更的。因此我们使用 `Tools/My Tools/Build Asset Bundle`一键生成AB包,将AB包放入服务器。 **注意:** 如果是在`Editor`下测试,需将`Tools/My Tools/Framework Setting`将使用该工程加载AB包资源取消勾选。否则将加载工程内的AB包资源。 使用如下API将AB包下载到本地下载,并指定当前环境使用的AB包本地路径。 ```Scharp // 下载AB包资源 AssetBundlesManager.Instance.DownLoadABs(url, OnDownLoadAB, OnDownLoadProgress, OnDownLoadComplete); // 指定AB包目录 AssetBundlesManager.Instance.ABLocalPath = path; ``` 大功告成,希望你也可以跑通! 若有疑问请提交至 `Issue` ,感谢!