首页 > 其他分享 >【Unity】 HTFramework框架(三十三)XLua热更新

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

时间:2022-12-13 14:32:25浏览次数:62  
标签:... MyLua endfunction XLua Lua Unity print HTFramework


更新日期: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开关,则在初始化时便自动启动热更新逻辑,否则,需要手动在代码中调用启动方法。

【Unity】 HTFramework框架(三十三)XLua热更新_初始化


2.与框架源生的Hotfix相同,点击下面的Create XHotfix Environment按钮便可一键创建XLua环境,创建完成后,面板会显示XLua环境已成功创建的提示。

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


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 了(虽然这里输出的并不是这几个字母):

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


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

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

【Unity】 HTFramework框架(三十三)XLua热更新_初始化_05


如下,新建一个名为 MyLua 的Lua脚本(实际上就是新建了一个MyLua模块):

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

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

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

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

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

运行,查看控制台输出:

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


按照此种方式,便可以扩展你的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

然后创建两个流程:

【Unity】 HTFramework框架(三十三)XLua热更新_初始化_08


在第二个流程中添加日志打印代码:

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()
{

}
}

运行,查看控制台输出:

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

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),主要用以调试或数据监测,目前面板如下:

【Unity】 HTFramework框架(三十三)XLua热更新_初始化_10


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


标签:...,MyLua,endfunction,XLua,Lua,Unity,print,HTFramework
From: https://blog.51cto.com/u_15911199/5934058

相关文章

  • 【Unity】 HTFramework框架(三十二)授权验证
    更新日期:2020年3月2日。Github源码:​​​[点我获取源码]​​​Gitee源码:​​[点我获取源码]​​索引​​授权验证简介​​​​使用授权验证​​​​取消永久授权​​​​......
  • Unity插件 - MeshEditor(八)模型镜像特效
    将静态模型(带MeshFilter)按指定轴向、指定距离克隆一个镜像物体出来,思路很简单,将模型的顶点坐标按指定轴取反,并累加上设定的距离值,然后就完毕了!不过,因为镜像体的顶点镜像于之......
  • 【Unity】 HTFramework框架(三十一)全局设置
    更新日期:2020年3月2日。Github源码:​​​[点我获取源码]​​​Gitee源码:​​[点我获取源码]​​索引​​全局设置简介​​​​使用全局设置​​​​打开全局设置面板​​......
  • unity使用ugui自制调色面板
    突然想实现一个调色面板,然后开工...首先找找有没有什么接口可调,木有找到,找到一些调用win32实现的本地颜色面板的调用,感觉不科学,反正多平台肯定是搞不定的。既然没找到,还是老......
  • Unity 自定义创建脚本模板
    Unity自定义创建脚本模板原理:以模板代码为底板,通过关键字替换来实现代码创建两种实现方案方案11.先准备好对应的代码模板,放到Assets\ScriptTemplates目录下usingSys......
  • Unity中实现A*寻路
    前言:最近没事儿没工作,计划每天写一篇博客,防止对Unity生疏,也可以记录学习的点点滴滴。A*寻路在很多面试里都会问到,但实际工作中根本用不着自己写,网上有成熟的插件,不容易错......
  • Unity 脚本基础
    Unity官方手册是最好的教程书,只是偶尔限于冗长ScriptingconceptsAlthoughUnityusesanimplementationofthestandardMonoruntimeforscripting,itstillh......
  • [SIGMOD 2022]DMCS Density Modularity based Community Search
    [SIGMOD2022]DMCS:DensityModularitybasedCommunitySearch介绍目标是找到含有查询点的社区。文章的切入点是高质量的社区一定也是高模块化的,及社区内密度高,且社......
  • unity 实现物体空间距离音量远小近大的效果
    需要两个组件一 AudioListener需要添加到摄像机,一般默认都有 二 AudioSource需要添加到需要发出声音的物体对象上将AudioSource中空间混合SpatialBlend设置为1......
  • 在Unity3D软件中将图片转换为UI图片
    在Unity3D软件中将图片转换为UI图片,先将图片拖进Unity3D中,然后在右侧栏Inspector->TextureType下选择Sprite(2DandUI),点击apply,图片变为UI图片(显示播放键)。 ......