# 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` 组件。

`ComponentIDE` 组件脚步名字段换成 `MainComponent`,此时可生成脚本按钮变成可点击状态。
`ComponentIDE` 支持四种数据配置:
+ 一般类型:可选择常用数据类型
+ Unity 对象:可通过拖拽选择Unity Object类型。并可通过下拉列表显示该对象所有组件,选择并赋值
+ 一般类型集合:是使用 `List<一般类型>` 的字段数据
+ Unity 对象集合:是使用 `List` 的字段数据
最下面有个预览按钮,该功能可用于预览要生成的数据脚本。不同类型由分界线隔开。
我们现在给该组件添加一个 `int` 字段命名为 `age` 并赋值为18,表示如下:

通过点击预览脚步可看到我们组件包含的数据

点击生成脚本后,会在目录下生成如下脚本 `Assets/Hotfix/Scripts/Component/MainComponent.cs`。
`Assets/Hotfix` 这个目录是热更DLL 目录,用于编写热更逻辑。
现在我们来创建热更相关代码。可供创建的脚本文件有四类:
- Scene 创建一个舞台(一个逻辑场景)
- Entity 创建一个演员(场景逻辑对象)
- Component 演员所需道具(数据字段)
- System 演员所演剧本(代码逻辑)

在 `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` ,感谢!