【Unity】 HTFramework框架(十九)ILHotfix热更新模块

更新日期:2019年9月27日。
Github源码:[点我获取源码]

ILHotfix热更新模块简介

基于ILRuntime实现的跨平台热更新方案,开发非常方便,新项目只需要拉取框架源码后,一键即可创建热更新环境,之后便可以正常开发。

使用ILHotfix热更新

创建ILHotfix环境

1.对于新项目,只要在工程中包含了HTFrameworkILHotfix模块,则自动启用了ILHotfix,勾选面板的Auto StartUp开关,则在初始化时便自动启动热更新逻辑,否则,需要手动在代码中调用ILHotfixManager的启动方法。
在这里插入图片描述
2.与框架源生的Hotfix相同,点击下面的Create ILHotfix Environment按钮便可一键创建ILHotfix环境。
在这里插入图片描述
3.创建完成后,面板会显示ILHotfix环境已成功创建的提示,同时,红色外框标记的便为此项目中ILHotfix代码的根目录,之后的ILHotfix代码可以按照常规C#代码的方式编写,但必须放在此目录下才会被认为是ILHotfix代码。
在这里插入图片描述
4.ILHotfix环境目录非常简单:

A.ILHotfix代码的根目录,新建的ILHotfix脚本都必须放在此目录下。
ILHotfixEnvironment为自动生成的热更新环境类,理论上你不需要改其中任何代码,当然,也支持扩展它。
ILHotfix.dll为我们热更的目标库(每次编译后会自动覆盖最新的),发布时只需将之打入指定AB包,并在B面板指定AB包名称及路径。

B.热更目标库打入的AB包名称及路径,如果没有特殊需求,这些可以保持默认值,热更目标库也始终放在A路径下。
在这里插入图片描述

创建ILHotfix流程

创建完ILHotfix环境后,我们直接运行就已经开始执行ILHotfix逻辑了,只不过此时的ILHotfix库为空,我们需要创建至少一个ILHotfix流程(与主框架类似,流程也是ILHotfix的生命周期)。

访问权限:ILHotfix代码能正常访问框架代码,但任何地方都无法访问ILHotfix代码!通过ILRunTime提供的方法可以使ILHotfix代码和外部代码以某种方式进行交互,可自行参见ILRunTime用户手册,不过应尽量避免这种跨域的访问。

推荐使用快捷创建方式:
Project界面右键 -> Create -> HTFramework ILHotfix -> C# ILHotfixProcedure Script
在这里插入图片描述
如下,我新建了一个名为Entrance的热更新流程,ILHotfixProcedureState.Entrance标记表明这是ILHotfix逻辑的入口流程:

/// <summary>
/// 新建热更新流程
/// </summary>
[ILHotfixProcedureState(ILHotfixProcedureState.Entrance)]
public class Entrance : ILHotfixProcedure
{
    /// <summary>
    /// 流程初始化
    /// </summary>
    public override void OnInit()
    {
        GlobalTools.LogInfo("初始化 " + typeof(Entrance).Name + " 流程!");
    }

    /// <summary>
    /// 进入流程
    /// </summary>
    public override void OnEnter()
    {
        GlobalTools.LogInfo("进入 " + typeof(Entrance).Name + " 流程!");
    }
    
    /// <summary>
    /// 离开流程
    /// </summary>
    public override void OnLeave()
    {
        GlobalTools.LogInfo("离开 " + typeof(Entrance).Name + " 流程!");
    }

    /// <summary>
    /// 流程帧刷新
    /// </summary>
    public override void OnUpdate()
    {
        Debug.Log(typeof(Entrance).Name + " 流程更新!");
    }

    /// <summary>
    /// 流程帧刷新(秒)
    /// </summary>
    public override void OnUpdateSecond()
    {
        
    }
}

在新建一个普通的流程Normal

/// <summary>
/// 新建热更新流程
/// </summary>
[ILHotfixProcedureState(ILHotfixProcedureState.Normal)]
public class Normal : ILHotfixProcedure
{
    /// <summary>
    /// 流程初始化
    /// </summary>
    public override void OnInit()
    {
        GlobalTools.LogInfo("初始化 " + typeof(Normal).Name + " 流程!");
    }

    /// <summary>
    /// 进入流程
    /// </summary>
    public override void OnEnter()
    {
        GlobalTools.LogInfo("进入 " + typeof(Normal).Name + " 流程!");
    }
    
    /// <summary>
    /// 离开流程
    /// </summary>
    public override void OnLeave()
    {
        GlobalTools.LogInfo("离开 " + typeof(Normal).Name + " 流程!");
    }

    /// <summary>
    /// 流程帧刷新
    /// </summary>
    public override void OnUpdate()
    {
        Debug.Log(typeof(Normal).Name + " 流程更新!");
    }

    /// <summary>
    /// 流程帧刷新(秒)
    /// </summary>
    public override void OnUpdateSecond()
    {
        
    }
}

我们在入口流程中切换流程:

    /// <summary>
    /// 流程帧刷新
    /// </summary>
    public override void OnUpdate()
    {
        Debug.Log(typeof(Entrance).Name + " 流程更新!");

        //鼠标左键双击时切换流程
        if (Main.m_Input.GetButtonDown(InputButtonType.MouseLeftDoubleClick))
        {
            //切换至 Normal 流程
            ILHotfixEnvironment.Environment.SwitchProcedure<Normal>();
        }
    }

设置资源加载模式

热更新必须使用AssetBundle加载模式,如果没有切换至该模式,将无法初始化热更新环境。
在这里插入图片描述

运行

然后我们直接运行场景就可以了,勾选AutoStartUp开关,让其自动启动热更新逻辑(因为是测试,所以我们不需要判断热更新库的版本并下载新版这个过程)。
在这里插入图片描述
接下来我们双击左键,可以看到已经正确的切换了流程:
在这里插入图片描述
之后可以在ILHotfix流程中扩展自己的代码,以及创建新的流程,不过,发布项目前务必确保最新的ILHotfix库已经被打入了AB包中!

注意:理论上ILHotfix与框架源生的Hotfix不冲突,两者可以共存,但同一个项目中没有同时使用两种方式的必要。

代码中启动热更新

        //当检测热更新库版本、下载最新版库等操作完成后,启动热更新逻辑
        ILHotfixManager.Current.StartUp();

猜你喜欢

转载自blog.csdn.net/qq992817263/article/details/96152656