找回密码
 立即注册
查看: 301|回复: 0

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

[复制链接]
发表于 2021-8-12 15:18 | 显示全部楼层 |阅读模式
更新日期: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脚本:
  1. --require 'your lua script name'
  2. Main =CS.HT.Framework.Main
  3. GameObject =CS.UnityEngine.GameObject
  4. Transform =CS.UnityEngine.Transform
  5. function OnInitialization()print("Lua OnInitialization...")
  6. end
  7. function OnPreparatory()print("Lua OnPreparatory...")
  8. end
  9. function OnRefresh()print("Lua OnRefresh...")
  10. end
  11. function OnRefreshSecond()print("Lua OnRefreshSecond...")
  12. end
  13. function OnTermination()print("Lua OnTermination...")
  14. 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(在属性面板修改)。


  1. MyLua ={}
  2. function MyLua.OnInitialization()print("Lua MyLua.OnInitialization...")
  3. end
  4. function MyLua.OnPreparatory()print("Lua MyLua.OnPreparatory...")
  5. end
  6. function MyLua.OnRefresh()print("Lua MyLua.OnRefresh...")
  7. end
  8. function MyLua.OnRefreshSecond()print("Lua MyLua.OnRefreshSecond...")
  9. end
  10. function MyLua.OnTermination()print("Lua MyLua.OnTermination...")
  11. end
  12. return MyLua
复制代码
加载自定义Lua代码

我们在Main中按如下方式加载MyLua模块:
  1. --加载 MyLua 模块
  2. require 'MyLua'
  3. Main =CS.HT.Framework.Main
  4. GameObject =CS.UnityEngine.GameObject
  5. Transform =CS.UnityEngine.Transform
  6. function OnInitialization()print("Lua OnInitialization...")--调用 MyLua 的全局方法
  7.         MyLua.OnInitialization()
  8. end
  9. function OnPreparatory()print("Lua OnPreparatory...")
  10. end
  11. function OnRefresh()print("Lua OnRefresh...")
  12. end
  13. function OnRefreshSecond()print("Lua OnRefreshSecond...")
  14. end
  15. function OnTermination()print("Lua OnTermination...")
  16. end
复制代码
运行,查看控制台输出:


按照此种方式,便可以扩展你的Lua业务代码。
在Lua中访问框架代码

我们如下修改Main.lua:
  1. Main =CS.HT.Framework.Main
  2. GameObject =CS.UnityEngine.GameObject
  3. Transform =CS.UnityEngine.Transform
  4. function OnInitialization()print("Lua OnInitialization...")
  5. end
  6. function OnPreparatory()print("Lua OnPreparatory...")
  7. end
  8. function OnRefresh()print("Lua OnRefresh...")--按下鼠标右键时,切换至下一个流程
  9.         if(Main.m_Input:GetButtonDown('MouseRight'))
  10.         then
  11.                 Main.m_Procedure:SwitchNextProcedure()
  12.         end
  13. end
  14. function OnRefreshSecond()print("Lua OnRefreshSecond...")
  15. end
  16. function OnTermination()print("Lua OnTermination...")
  17. end
复制代码
然后创建两个流程:


在第二个流程中添加日志打印代码:
  1. publicclassNewProcedure2:ProcedureBase{/// <summary>/// 流程初始化/// </summary>publicoverridevoidOnInit(){}/// <summary>/// 进入流程/// </summary>/// <param name="lastProcedure">上一个离开的流程</param>publicoverridevoidOnEnter(ProcedureBase lastProcedure){
  2.         GlobalTools.LogInfo("切换至流程2");}/// <summary>/// 离开流程/// </summary>/// <param name="nextProcedure">下一个进入的流程</param>publicoverridevoidOnLeave(ProcedureBase nextProcedure){}/// <summary>/// 流程帧刷新/// </summary>publicoverridevoidOnUpdate(){}/// <summary>/// 流程帧刷新(秒)/// </summary>publicoverridevoidOnUpdateSecond(){}}
复制代码
运行,查看控制台输出:



C#中获取Lua全局变量

通过如下方式在C#中获取Lua全局变量:
  1. //获取名称为 Level 的 int 全局变量
  2.         XHotfixManager.Current.Get<int>("Level");
复制代码
C#中设置Lua全局变量

通过如下方式在C#中设置Lua全局变量:
  1. //设置一个名称为 Level 的 int 全局变量,该变量值为50
  2.         XHotfixManager.Current.Set("Level",50);
复制代码
其他关于XLua的详细使用教程请参阅:XLue教程
运行时检视面板

在编辑器中运行时将会出现运行时检视面板(Runtime Data),主要用以调试或数据监测,目前面板如下:


1.Loaded Lua Codes:显示当前已经加载的Lua脚本,只有已经加载的脚本,才能通过require加载并运行。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 10:03 , Processed in 0.091639 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表