C#调用lua

直接拿官方的demo里的脚本作为例子

C#中编译Lua脚本的格式

private string script =
        @" lua脚本";

首先new一个lua

LuaState lua = new LuaState();
        lua.Start();

在C#中执行编译的Lua脚本

lua.DoString("事先编译好的string格式的Lua脚本方式");

获取lua变量

//通过LuaState访问
Debugger.Log("Read var from lua: {0}", lua["var2read"]);
Debugger.Log("Read table var from lua: {0}", lua["varTable.default"]);  //LuaState 拆串式table

调用Lua方法

LuaFunction func = lua["TestFunc"] as LuaFunction;
func.Call();
func.Dispose();

访问LuaTable
lua脚本

            var2read = 42
            varTable = {1,2,3,4,5}
            varTable.default = 1
            varTable.map = {}
            varTable.map.name = 'map'
            
            meta = {name = 'meta'}
            setmetatable(varTable, meta)
            
            function TestFunc(strs)
                print('get func by variable')
            end

C#脚本

        //cache成LuaTable进行访问
        LuaTable table = lua.GetTable("varTable");
        Debugger.Log("Read varTable from lua, default: {0} name: {1}", table["default"], table["map.name"]);
        table["map.name"] = "new";  //table 字符串只能是key
        Debugger.Log("Modify varTable name: {0}", table["map.name"]);

        table.AddTable("newmap");
        LuaTable table1 = (LuaTable)table["newmap"];
        table1["name"] = "table1";
        Debugger.Log("varTable.newmap name: {0}", table1["name"]);
        table1.Dispose();

        table1 = table.GetMetaTable();

        if (table1 != null)
        {
            Debugger.Log("varTable metatable name: {0}", table1["name"]);
        }

        object[] list = table.ToArray();//转成List格式

        for (int i = 0; i < list.Length; i++)
        {
            Debugger.Log("varTable[{0}], is {1}", i, list[i]);
        }

        table.Dispose();                        
        lua.CheckTop();
        lua.Dispose();

### C# 调用 Lua 的工作原理 在 Unity 中通过 C# 调用 Lua 主要依赖于第三方库如 XLua 或 ToLua 来桥接两种语言之间的交互。XLua 提供了一种机制使得可以在 C# 环境下加载并执行 Lua 文件中的代码。 当使用 `require` 函数引入其他 Lua 模块时,例如: ```lua print("主Lua启动") require("Test") -- 加载 Test.lua 文件[^1] ``` 这行代码会在 Lua 运行环境中查找名为 "Test" 的模块,并尝试加载它。如果是在 Unity 下运行,则会由 XLua 处理这个请求并将对应的 Lua 文件映射到实际路径上进行解析和执行。 对于 C#Lua 之间更深层次的互操作性来说,通常涉及到以下几个方面的工作原理: #### 数据交换与类型转换 为了允许两个不同编程环境间的数据传递,必须定义一套双方都能理解的数据结构以及相应的序列化/反序列化逻辑。XLua 实现了基本数据类型的自动转换功能,同时也支持自定义类对象作为参数传入传出 Lua 函数调用。 #### 方法绑定 为了让 Lua 可以访问 C# 定义的方法或者属性,需要建立一种方式来注册这些成员给 Lua 使用。XLua 支持静态方法、实例方法甚至事件监听器等多种形式的方法暴露给 Lua 层面去调用。同样地,在 Lua 编写的函数也可以被 C# 所回调,形成双向通信的能力。 #### 性能优化策略 考虑到频繁跨越边界可能会带来性能开销,因此框架内部采取了一些措施减少不必要的切换次数。比如缓存已经编译好的 Lua chunk(即一段完整的可执行单元),避免重复解释相同的源码;另外还提供了批量提交指令的功能以便一次性完成多个操作而不需要多次上下文切换。 ```csharp // 注册C#方法给Lua使用的一个简单例子 public class Example : MonoBehaviour { void Start() { // 假设这里初始化好了LuaEnv环境变量env env.Global.SetAsFunction("PrintFromCS", PrintMessage); } public static void PrintMessage(string msg){ Debug.Log(msg); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值