更新日期:2020年3月20日。
Github源码:[点我获取源码] Gitee源码:[点我获取源码]
索引
- XLua热更新简介
- 使用XLua热更新
- 创建XLua开发环境
- 运行XLua逻辑
- Lua入口解析
- 编写自己的Lua脚本
- 加载自定义Lua代码
- 在Lua中访问框架代码
- C#中获取Lua全局变量
- C#中设置Lua全局变量
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加载并运行。