【Unity】使用XLua实现C#访问Lua文件

先引入XLua文件中的Plugins和XLua文件夹于Unity项目的Asset文件中
XLua_github链接

建立Lua虚拟机:LuaEnv luaEnv = new LuaEnv();

关闭虚拟机,及时释放资源:luaEnv.Dispose();

Resources文件夹下加载lua文件(假设文件路径为Resources/Lua/test.lua.text):

luaEnv.DoString("require 'lua/test'");

加载自定义文件夹下的lua文件(假设文件路径为Asset/Lua/test.lua):

(a)编写加载Lua文件的加载器:

private byte[] LoadLua(ref string file)

{

string luaStr = File.ReadAllText(Application.dataPath + "/Lua/" + file + ".lua");

byte[] luaByte = new UTF8Encoding().GetBytes(luaStr);

return luaByte;

}

(b)为虚拟机添加Lua加载器:

luaEnv.AddLoader(LoadLua);

(c)运行lua文件:

luaEnv.DoString("require 'test'");

假设有test.lua:

a = 1

b = true

c = "你好嘛"

table1 = {"aa", "bb", "cc", "12", "23', true, false}

person =

{

name = "zhaoxi",

age = 18

}

function Add(a, b)

return a + b

end

function Get(a, b)

return a,b

end

获取lua文件的全局变量:

int:int a = luaEnv.Global.Get<int>("a");

bool:bool b = luaEnv.Global.Get<bool>("b");

string:string c = luaEnv.Global.Get<string>("c");

访问table的四种方式:

(1)值类型方式:

(1-1)类的形式访问:

(a)定义一个类Person:

public class Person

{

public string name;

public int age;

}

(b)获取lua数据:

Person person = luaEnv.Global.Get<Person>("person");

Debug.Log(person.name + person.age);

(1-2)Dictionary List的方式访问:

Dictionary<string, object> tableDic = luaEnv.Global.Get<Dictionary<string, object>>("person");

Debug.Log(tableDic["name"] + " " + tableDic["age"]);

List<Object> tableList = lua.Global.Get<List<object>>("table1");

Debug.Log(tableList[0].ToString());

(2)引用类型访问:

(2-1)接口访问:

(a)定义接口IPerson(需挂载[CSharpCallLua]):

CSharpCallLua

public interface IPerson

{

public string name{get; set;}

public int age{get; set;}

}

(b)接收来自Lua的数据:

IPerson iperson = luaEnv.Global.Get<IPerson>("person");

Debug.Log(iperson.name);

iperson.name = ''yeye'';//修改lua数据,但不会对原lua文件造成影响

luaEnv.DoString("print(person.name)");//打印为yeye

(2-2)LuaTable的方式访问(能够实现动态行为,减少编译时间,但是性能开销较大,且难以追踪问题还会报类型安全的错误等等):

LuaTable luaTable = luaEnv.Global.Get<LuaTable>("person");

Debug.Log(luaTable.Get<string>("name"));//打印"zhaoxi"

访问全局函数:

(1)使用委托访问(需在委托前挂载[CSharpCallLua])优点:调用直接、性能快但是灵活性差

(a)定义委托

CSharpCallLua\] public delegate int Add(int a, int b); \[CSharpCallLua\] public delegate int Get(int a, int b, out int c); (b)获取函数 Add addFunc = luaEnv.Global.Get\("add"); addFunc(1, 2); Get get = luaEnv.Global.Get\("get"); int num1, num2; num1 = get(1, 2, out num2); Debug.Log(num1 + " " + num2);//num1 = 1, num2 = 2 (2)使用LuaFunction优点:灵活性高,减少C#与Lua的桥接代码 LuaFunction luaFunction = luaEnv.Global.Get\("add"); LuaFunction luaFunction1 = luaEnv.Global.Get\("get"); object\[\] obs = luaFuction.Call(1, 2); object\[\] obs1 = luaFunction.Call(1, 2); Debug.Log(obs\[0\]);//3 Debug.Log(obs\[0\] + " " + obs\[1\]);//1, 2

相关推荐
从孑开始1 小时前
ManySpeech.MoonshineAsr 使用指南
人工智能·ai·c#·.net·私有化部署·语音识别·onnx·asr·moonshine
YuanlongWang2 小时前
C# 中,依赖注入(DI)的实现方式
c#
SmartSoftHelp开发辅助优化3 小时前
C# WinForm 编程高手:程序,进程,线程。程序,窗体,UI,后台。是如何协调工作的?深度解析>SmartSoftHelp魔法精灵工作室
microsoft·ui·c#
future_studio5 小时前
聊聊 Unity(小白专享、C# 小程序 之 加密存储)
开发语言·小程序·c#
c#上位机6 小时前
MefBootstrapper在Prism引导程序中的使用
c#·wpf·prism
嵌入式-老费8 小时前
Easyx图形库应用(用lua开发图形界面)
开发语言·lua
ellis19708 小时前
Lua协程coroutine库用法
开发语言·lua
〆WangBenYan゜8 小时前
postman 调用接口设置全局变量
测试工具·lua·postman
玩泥巴的8 小时前
.NET驾驭Word之力:基于规则自动生成及排版Word文档
c#·word·.net·com互操作
SunnyDays10119 小时前
C# 实现高保真 Excel 转 PDF(无需 Office 环境)
经验分享·c#·excel转pdf