xLua(三)——在C#中访问Lua代码
发布日期:2021-06-30 19:59:08
浏览次数:4
分类:技术文章
本文共 1809 字,大约阅读时间需要 6 分钟。
xLua提供的各种方法都是在LuaEnv(Lua的环境)类中的,使用之前需要构造一个Lua对象(LuaEnv虚拟机),之后用这个虚拟机去访问各种方法
一个LuaEnv对应一个Lua虚拟机,出于开销的考虑,建议全局唯一
——xLua加载Lua文件是通过DoString来实现的,DoString的参数是一个字符串 ——当在C#中使用Lua虚拟机对象去调用Lua代码,输出结果的前面会带有一个LUA:,标明是Lua中的输出(与Debug.Log区分)
一:参数里直接写Lua语句
参数必须符合Lua语法
二:通过Resources加载Lua文本文件
注意在Unity中不论是Resources加载还是面板赋值,都无法识别到后缀为.lua的文件,为了区分lua文件与txt文件,可以将文件的名字命名为XXX.lua.txt,这样既可以在Unity中识别到同时也标明了这个文件是一个lua文件
先加载lua文本文件,再将lua文本文件中的文本作为参数传入DoString参数中,本质与第一种直接在参数里写语句是一样的三:Lua中调用C#的类去执行代码
它本质的意义是在Lua中调用了C#中的API,所以输出结果不带LUA:,结果正常输出
以上方法显然很麻烦,DoString里的参数还可以使用require,在Lua中require是引入了一个模块(文件),而在DoString的参数中这样写既可以引入模块还可以加载模块中的代码
四:调用内置loader
当在DoString的参数中传入require时,会自动调用xLua的内置方法:loader loader会从Resources文件夹中加载XXX.lua.txt的文件,它相当于自动执行了这句代码:Resources.Load<TextAsset>("XXX.lua").text
注意: ——引入的文件名必须为XXX.lua.txt ——文件必须放在Resources文件夹里五:自定义loader
首先看一下底层源码:
使用AddLoader可以添加自定义loader方法,在DoString的参数中传入require后在底层是这样执行的: 1.先去加载自定义的loader方法(每个自定义的loader方法都返回一个字节数组) 2.如果返回值为空,则继续查找下一个loader方法,如果返回值不为空,则返回自定义loader的返回值 3.如果所有自定义的方法都返回空,则使用内置的loader方法从Resources文件夹中加载 例如还是之前的1.lua.txt文件 ——第一种情况 因为自定义的loader返回值为空,所以最终执行内置的loader——第二种情况 因为自定义的loader返回值为空,所以最终仍然会执行内置的loader,但是自定义的loader方法也会执行 需要注意的是,require后的参数是什么,loader在回调的时候filepath就会被设置为什么
——第三种情况 因为自定义的loader返回值不为空,所以直接输出自定义loader的返回值,不会再执行内置的loader
——————————自定义loader示例 例如Lua文件不在Resources文件夹中而是在其他的路径下:
using UnityEngine;using XLua;public class Test : MonoBehaviour{ private void Start() { LuaEnv luaenv = new LuaEnv(); luaenv.AddLoader(MyLoader); luaenv.DoString("require '1'"); //LUA:4 luaenv.Dispose(); } //自定义的loader private byte[] MyLoader(ref string filePath) { string path = @"C:\Unity\xlua\Assets\" + filePath + ".lua.txt"; return System.Text.Encoding.UTF8.GetBytes(System.IO.File.ReadAllText(path)); }}
转载地址:https://liuhaowen.blog.csdn.net/article/details/89300370 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年04月25日 00时51分02秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
二叉树三种遍历(递归+迭代)Java
2019-04-30
剑指offer 链表中环入口结点(哈希表/双指针)
2019-04-30
Java自定义注解(一)
2019-04-30
Java自定义注解使用 批量执行测试 (二)
2019-04-30
IDEA Maven Mybatis target下无 xml文件
2019-04-30
IDEA创建一个模板
2019-04-30
C++ 键盘接收字符建立动态二维数组无冗余
2019-04-30
IDEA Spring整合Mybatis详细教程
2019-04-30
servlet解决中文获得参数乱码问题
2019-04-30
微信小程序tab栏切换实现
2019-04-30
选择排序和冒泡排序
2019-04-30
break ---return ----continue区别
2019-04-30
连续子数组最大和的三种经典算法
2019-04-30
c/c++实现奇偶数,质数,最大公约数,最小公倍数,最大奇约数判断
2019-04-30
远程桌面
2019-04-30
realloc,malloc,calloc的区别和二维动态数组创建示例
2019-04-30
线性表基本操作——删除,插入等
2019-04-30
C语言 二维数组(指针)动态分配和释放
2019-04-30
动态规划入门
2019-04-30