Lua与C#的交互1

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using LuaInterface;
 6 
 7 namespace LuaTest001
 8 {
 9     /// <summary>
10     /// 1.把LuaInterface.dll,Lua51.dll,luanet.dll放在exe文件里
11     /// 2.引用LuaInterface.dll类库
12     /// 3.在C#定义的函数和Lua同步的函数一定要注意命名,大小写和访问类型一定要一致,否则会出现报错(真的感觉坑爹)
13     /// 4.导出的Unity文件,需要把1中的dll放在同级,在editor中,直接放入assert下面,引用就可以。
14     /// </summary>
15     class Program
16     {
17 
18         private static Lua m_lua = new Lua();
19         public static void Init()
20         {
21             Program p = new Program();
22             m_lua.RegisterFunction("Print_Lua", p, p.GetType().GetMethod("Print_Csharp"));
23             m_lua.DoFile(@"C:\test.lua");
24         }
25 
26         public void Print_Csharp(string s)
27         {
28             Console.WriteLine(s);
29         }
30         static void Main(string[] args)
31         {
32             Init();
33             m_lua.GetFunction("Show").Call();
34         }
35     }
36 }

 

转载请注明地址:http://www.cnblogs.com/Vincentblogs/p/4083028.html

QQ群:346738352 Unity技术交流群,讲纯粹的技术。 

转载于:https://www.cnblogs.com/Vincentblogs/p/4083003.html

<think>我们正在讨论LuaC#交互原理和方法。根据引用内容,交互主要通过栈操作和中间层(wrap文件)实现。C#调用Lua时,将请求或数据放在栈顶,Lua取出处理后再放回栈顶;Lua调用C#则需要通过wrap文件将C#的字段和方法注册到Lua虚拟机。下面将详细解释交互原理及方法。</think>### LuaC#交互原理及方法 #### **一、交互原理** LuaC#交互的核心是通过**虚拟栈**实现数据传递,并依赖**中间层**进行类型转换: 1. **栈机制**(核心原理): - C#将数据/请求压入Lua虚拟栈顶 → Lua从栈顶取出数据 → Lua处理后将结果压回栈顶 → C#从栈顶获取结果[^2] - 例如:`lua.DoString("return 10+20")`中,Lua将计算结果`30`压栈,C#通过栈获取值 2. **中间层适配**: - **Wrap文件**:自动生成的适配层代码,将C#类/方法注册到Lua虚拟机[^3] - **类型绑定**:通过配置文件声明需暴露给LuaC#类型(如`[LuaCallCSharp]`属性) #### **二、交互方法** ##### **1. C#调用Lua** ```csharp // 初始化Lua环境 LuaState lua = new LuaState(); lua.Start(); // 执行Lua脚本 lua.DoFile("test.lua"); // 获取Lua全局变量 double num = lua.GetNumber("luaVar"); // 调用Lua函数 LuaFunction func = lua.GetFunction("luaAdd"); int result = func.Call(10, 20)[0].ToInt(); // 传入参数并获取返回值 ``` ##### **2. Lua调用C#** ```lua -- 访问C#静态类 CS.UnityEngine.Debug.Log("Hello from Lua") -- 创建C#对象 local go = CS.UnityEngine.GameObject("LuaObj") -- 调用实例方法 go:SetActive(false) ``` #### **三、关键技术组件** | 组件 | 作用 | 示例 | |------|------|------| | **LuaInterface** | C#Lua的桥接库 | `Lua lua = new Lua()` | | **XLua/ToLua** | 热更新方案 | 自动生成Wrap文件 | | **元表(metatable)** | 扩展Lua对象行为 | 实现C#对象的索引器 | | **类型映射系统** | 自动转换数据类型 | Lua表 ↔ C# `Dictionary` | #### **四、性能优化关键** 1. **减少跨语言调用**:避免在循环中频繁调用Lua函数 2. **缓存Lua对象**:重用`LuaFunction`/`LuaTable`减少查找开销 3. **值类型优先**:传递`int`/`double`而非`object`减少装箱 4. **使用LuaJIT**:提升脚本执行效率(仅支持64位环境) > **应用场景**:游戏热更新(逻辑热重载)、配置表解析、AI行为树动态调整等需要运行时逻辑变更的场景[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值