首页 > 其他分享 >【热更新实践】xLua基本用法

【热更新实践】xLua基本用法

时间:2022-11-11 18:03:40浏览次数:84  
标签:Lua C# 实践 xLua 用法 lua luaEnv public LuaEnv

这边文章是看xlua官方教程和一些文档之后的一个总结,希望大家都能学会lua,当然最希望我能快点学会lua。。。


C#调用Lua

(1) LuaEnv

LuaEnv是C#中调用lua时需要用到的lua环境提示,需要在C#中使用Lua语法的时候就需要new一个LuaEnv。

下面这个案例展示了在C#中用Lua语法打印一句话:

  public LuaEnv luaEnv;
// Start is called before the first frame update
void Start()
{
luaEnv = new LuaEnv();
luaEnv.DoString("print('这是一个lua语法的句子')");
}

输出结果如下:

【热更新实践】xLua基本用法_lua

(2)C#调用Lua语句和Lua文件

调用lua语句上面已经演示了,不再赘述。我们还可以通过读取文件的方式来访问lua文件,以下为代码演示:

    public LuaEnv luaEnv;
private void Start()
{
var lua = Resources.Load<TextAsset>("LuaScripts/Test");
if (lua!= null)
{
luaEnv = new LuaEnv();
luaEnv.DoString(lua.text);
luaEnv.Dispose();
}
}

需要访问的文件是在Assets/Resources/LuaScripts下新增了一个text格式的文件,代码如下:

a=2
b=5
print("a+b="..a+b)
print("这是一段lua代码")

输出结果如下:

【热更新实践】xLua基本用法_c#_02

(3)使用Loader进行文件加载

这种方式的关键词是require。xLua自身有一些Loader可以用来添加文件,也可以自己添加loader。

Resources中的文件是可以通过自带的Loader进行加载的,不过前提是需要将文件的后缀改为.lua.text。

【热更新实践】xLua基本用法_xLua_03

以下是代码演示:

    public LuaEnv luaEnv;
private void Start()
{
luaEnv = new LuaEnv();
luaEnv.DoString("require 'Test'");
}

输出结果如下:

【热更新实践】xLua基本用法_c#_04

当然这无法满足我们的大多数需求,接下来我们来看自定义Loader,只涉及到一个接口:

 public delegate byte[] CustomLoader(ref string filepath);
public void LuaEnv.AddLoader(CustomLoader loader)

以下是我们的案例代码:

我们将lua脚本移动到Resources下的LuaScripts文件中后,上面的xLua自带的Loader就找不到文件了。我们将这个脚本的后缀改为.bytes,然后使用如下C#代码进行调用。

    public void Start()
{
LuaEnv luaEnv = new LuaEnv();
luaEnv.AddLoader(MyLoader);
luaEnv.DoString("require 'Assets/Resources/LuaScripts/Test.bytes'");//这一串有点长,实际使用中可以写个方法来获取,后续再总结一篇Xlua热更新框架的笔记
luaEnv.Dispose();
}

private byte[] MyLoader(ref string path)
{
return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path));
}

输出结果如下:

【热更新实践】xLua基本用法_lua_05

(4)C#访问Lua的数据结构

 luaenv.Global.Get<int>("a")
luaenv.Global.Get<string>("b")
luaenv.Global.Get<bool>("c")

还是上述的lua脚本,我们在C#脚本中用以下代码进行获取:

Debug.Log(luaEnv.Global.Get<int>("a"));
打印结果为2,成功访问到Lua中的变量的值。

Lua调用C#

需要添加CS关键字进行调用:

-- 实例化对象  
local go = CS.UnityEngine.GameObject("LuaGameObject")

-- 访问静态属性、方法
local deltaTime = CS.UnityEngine.Time.deltaTime
local GameObject = CS.UnityEngine.GameObject
local camera = GameObject.Find("Main Camera")

-- 访问成员属性、方法
camera.name = "LuaCamera"
camera:GetComponent("Camera").clearFlags = CS.UnityEngine.CameraClearFlags.SolidColor



参考文献

​https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/XLua%E6%95%99%E7%A8%8B.md​

​https://blog.csdn.net/LWR_Shadow/article/details/127113712?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-2-127113712-blog-89296680.pc_relevant_landingrelevant&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-2-127113712-blog-89296680.pc_relevant_landingrelevant&utm_relevant_index=5​

标签:Lua,C#,实践,xLua,用法,lua,luaEnv,public,LuaEnv
From: https://blog.51cto.com/u_15639010/5845230

相关文章

  • uniapp之uni-starter小程序多端研发框架搭建与项目实践
    随着移动互联网的飞速发展,无数移动APP琳琅满目;在移动App的发展的基础上,衍生了小程序、轻应用技术,它随时可用,但又无需安装卸载。小程序是一种不需要下载安装即可使用的应用,......
  • 实验4:开源控制器实践——OpenDaylight
    一、实验目的能够独立完成OpenDaylight控制器的安装配置;能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境Ubuntu20.04Desktopamd64三、实验......
  • (转)Hive中JOIN的用法以及一些注意事项总结。
    原文:https://www.dandelioncloud.cn/article/details/1529381803362369537Hive表连接的语法支持如下:join_table:table_referenceJOINtable_factor[join_condition]......
  • js问号点的作用(?.)和问号问号(??)的用法
    参考:https://blog.csdn.net/qq_44943717/article/details/109890133js问号点的作用?.和??的用法**第一个:问号点(?.)****第二个:问号问号(??)**第一个:问号点(?.)来先看一段j......
  • 动态sql(foreach)用法
    <selectid="getProjectEquipment"resultType="com.yeejoin.amos.boot.module.ugp.api.dto.ProjectResourceDto">SELECTequipment.name,equipment.`code`......
  • 系统稳定性建设实践总结
    目录​​开篇​​​​一、系统稳定性建设是指什么?​​​​二、为什么需要系统稳定性建设?​​​​三、系统稳定性建设为什么难?​​​​3.1面对的挑战比较大​​​​3.2系统......
  • B站在实时音视频技术领域的探索与实践
    B站在实时音视频技术领域的探索与实践https://mp.weixin.qq.com/s/NbN4WjBzTjddS8nl6Oh_CgB站在实时音视频技术领域的探索与实践原创 马家忆 哔哩哔哩技术 2022-11-1......
  • 实验7:基于REST API的SDN北向应用实践
    实验7:基于RESTAPI的SDN北向应用实践一、实验目的1.能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;2.能够编写程序调用RyuRESTAPI实现特定网络功能。二、实......
  • os.path.join() 用法
    参考源: (85条消息)os.path.join()用法_MclarenSenna的博客-CSDN博客_os.path.join os.path.join()函数用于路径拼接文件路径,可以传入多个路径。从后往前看,会从第一......
  • DevExpress的控件TextEdit只允许输入正整数用法记录
    在TextEdtit---->Properties—>MaskSettingsMaskType设置ExtendedRegularExpressionMaskExpression设置[0-9]*如图:......