【Unity】 HTFramework框架(三十三)XLua热更新

更新日期:2020年3月20日。
Github源码:[点我获取源码]

XLua热更新简介

XLua是一个针对C#(Unity, . net, Mono)的Lua编程解决方案,它支持android, ios, windows, linux, osx等。

本模块旨在结合XLua与框架的资源加载策略,快速实现热更流程,并优化了开发环境,使得开发人员可以最低成本的投入到Lua业务开发。

使用XLua热更新

创建XLua开发环境

1.对于新项目,只要在工程中包含了HTFrameworkXLua模块,则自动启用了XLua,勾选面板的Auto StartUp开关,则在初始化时便自动启动热更新逻辑,否则,需要手动在代码中调用启动方法。
在这里插入图片描述
2.与框架源生的Hotfix相同,点击下面的Create XHotfix Environment按钮便可一键创建XLua环境,创建完成后,面板会显示XLua环境已成功创建的提示。
在这里插入图片描述
3.XLua的环境目录非常简单:

A、Lua代码的根目录,新建的Lua脚本都必须放在此目录下(如要修改,先删除此目录,再修改面板的XHotfixCode AssetsPath属性,然后重新创建环境)。
①、 Main.lua为自动生成的Lua代码入口,由B面板的XHotfixCodeMain属性指定。

B、XLua控制器的属性面板:
①、LoaderType:自定义XLua加载器的类型。
②、Auto StartUp:是否自动启动Lua逻辑。
③、Tick Interval:XLua一次Tick的间隔时间(秒)。
④、XHotfixCode AssetBundleName:Lua代码将会被打入的AB包名称(所有Lua代码单独打入一个AB包)。
⑤、XHotfixCode AssetsPath:Lua代码所在的文件夹。
⑥、XHotfixCode Main:Lua代码的入口。

运行XLua逻辑

我们创建热更环境完成后,在主场景中加入框架主预制体及XLua管理器预制体,直接运行场景,便可以看到 Hello world 了(虽然这里输出的并不是这几个字母):

在这里插入图片描述
在这里插入图片描述

Lua入口解析

如上的 Hello world 很明显是由Main.lua输出的,我们直接打开Main.lua脚本:

--require 'your lua script name'

Main = CS.HT.Framework.Main
GameObject = CS.UnityEngine.GameObject
Transform = CS.UnityEngine.Transform

function OnInitialization()
	print("Lua OnInitialization...")
end

function OnPreparatory()
	print("Lua OnPreparatory...")
end

function OnRefresh()
	print("Lua OnRefresh...")
end

function OnRefreshSecond()
	print("Lua OnRefreshSecond...")
end

function OnTermination()
    print("Lua OnTermination...")
end

与一些常规的C#脚本生命周期类似,Main.lua代表整个Lua代码的生命周期:

OnInitialization:Lua初始化,一些初始化操作可以放在这里。

OnPreparatory:Lua准备完毕(第二轮初始化),为什么会有第二轮初始化?类似Monobehaver的Awake和Start,Awake是自身初始化,Start才是需要访问其他对象的进一步初始化,以保证在Start访问到其他对象时,对方已经通过Awake完成自身初始化。

OnRefresh:Lua逻辑帧轮询,类似Monobehaver的Update。

OnRefreshSecond:Lua逻辑秒轮询,以主程序的帧刷新频率而定的秒为单位的轮询,每秒呼叫一次,一些调用不频繁但又需要实时刷新的逻辑可以放在这里,比如实时刷新当前时间。

OnTermination:Lua逻辑终止。

编写自己的Lua脚本

首先,通过快捷创建方式新建一个Lua脚本:
Project界面右键 -> Create -> HTFramework XLua -> [XHotfix] Lua Script
在这里插入图片描述
如下,新建一个名为 MyLua 的Lua脚本(实际上就是新建了一个MyLua模块):

注意:为了能正确加载Lua代码,模块的名称与Lua脚本名称必须保持一致。

注意:XHotfix路径下的子路径里的Lua脚本也会被自动加载,不过必须保证所有Lua脚本的名称不重复。

注意:项目发布时,必须将所有Lua脚本标记为AB包名称xhotfix(在属性面板修改)。
在这里插入图片描述

MyLua = {}

function MyLua.OnInitialization()
	print("Lua MyLua.OnInitialization...")
end

function MyLua.OnPreparatory()
	print("Lua MyLua.OnPreparatory...")
end

function MyLua.OnRefresh()
	print("Lua MyLua.OnRefresh...")
end

function MyLua.OnRefreshSecond()
	print("Lua MyLua.OnRefreshSecond...")
end

function MyLua.OnTermination()
    print("Lua MyLua.OnTermination...")
end

return MyLua

加载自定义Lua代码

我们在Main中按如下方式加载MyLua模块:

--加载 MyLua 模块
require 'MyLua'

Main = CS.HT.Framework.Main
GameObject = CS.UnityEngine.GameObject
Transform = CS.UnityEngine.Transform

function OnInitialization()
	print("Lua OnInitialization...")

	--调用 MyLua 的全局方法
	MyLua.OnInitialization()
end

function OnPreparatory()
	print("Lua OnPreparatory...")
end

function OnRefresh()
	print("Lua OnRefresh...")
end

function OnRefreshSecond()
	print("Lua OnRefreshSecond...")
end

function OnTermination()
    print("Lua OnTermination...")
end

运行,查看控制台输出:
在这里插入图片描述
按照此种方式,便可以扩展你的Lua业务代码。

在Lua中访问框架代码

我们如下修改Main.lua:

Main = CS.HT.Framework.Main
GameObject = CS.UnityEngine.GameObject
Transform = CS.UnityEngine.Transform

function OnInitialization()
	print("Lua OnInitialization...")
end

function OnPreparatory()
	print("Lua OnPreparatory...")
end

function OnRefresh()
	print("Lua OnRefresh...")

	--按下鼠标右键时,切换至下一个流程
	if(Main.m_Input:GetButtonDown('MouseRight'))
	then
		Main.m_Procedure:SwitchNextProcedure()
	end
end

function OnRefreshSecond()
	print("Lua OnRefreshSecond...")
end

function OnTermination()
    print("Lua OnTermination...")
end

然后创建两个流程:
在这里插入图片描述
在第二个流程中添加日志打印代码:

public class NewProcedure2 : ProcedureBase
{
    /// <summary>
    /// 流程初始化
    /// </summary>
    public override void OnInit()
    {

    }

    /// <summary>
    /// 进入流程
    /// </summary>
    /// <param name="lastProcedure">上一个离开的流程</param>
    public override void OnEnter(ProcedureBase lastProcedure)
    {
        GlobalTools.LogInfo("切换至流程2");
    }

    /// <summary>
    /// 离开流程
    /// </summary>
    /// <param name="nextProcedure">下一个进入的流程</param>
    public override void OnLeave(ProcedureBase nextProcedure)
    {
        
    }

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

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

运行,查看控制台输出:
在这里插入图片描述

C#中获取Lua全局变量

通过如下方式在C#中获取Lua全局变量:

        //获取名称为 Level 的 int 全局变量
        XHotfixManager.Current.Get<int>("Level");

C#中设置Lua全局变量

通过如下方式在C#中设置Lua全局变量:

        //设置一个名称为 Level 的 int 全局变量,该变量值为50
        XHotfixManager.Current.Set("Level", 50);

其他关于XLua的详细使用教程请参阅:XLue教程

运行时检视面板

在编辑器中运行时将会出现运行时检视面板(Runtime Data),主要用以调试或数据监测,目前面板如下:
在这里插入图片描述
1.Loaded Lua Codes:显示当前已经加载的Lua脚本,只有已经加载的脚本,才能通过require加载并运行。

猜你喜欢

转载自blog.csdn.net/qq992817263/article/details/104993852
今日推荐