Type: concept
Confidence: 0.85
Created: 2026-04-16
Updated: 2026-04-16
Tags: 技术Lua游戏开发UnityC#Lua编程

MoonSharp 与 NLua

概述

MoonSharp 和 NLua 是两种在 Unity(及任意 .NET 项目)中嵌入 Lua 脚本的主流桥接库,前者为纯 C# 实现,后者基于原生 Lua C 库,两者均提供 C# 对象注入、函数互调和返回值获取机制。

关键内容

MoonSharp:纯 C# Lua 解释器

MoonSharp 是完全用 C# 实现的 Lua 5.2 解释器,无原生 DLL 依赖,适合 IL2CPP/AOT 平台(iOS 等)。

对象注册流程: 1. 在 C# 类上标注 [MoonSharpUserData],通过 UserData.RegisterAssembly() 批量注册 2. script.Globals["key"] = obj 将 C# 对象注入 Lua 全局变量 3. 静态类通过 UserData.Create(typeof(SomeClass)) 包装后注入

调用机制: - script.DoString(code) / script.DoFile(path) 执行 Lua 代码 - DynValue fn = script.Globals.Get("update"); script.Call(fn, arg) 调用 Lua 函数 - DynValue result = script.DoString("return 1+2"); float val = (float)result.Number 获取返回值

类型系统:DynValue 是 MoonSharp 的通用值容器,通过 .Number.String.Table.Function 等属性读取具体类型。

NLua:原生 Lua C 库绑定

NLua 基于 KeraLua 封装原生 Lua 5.4(通过 P/Invoke),性能接近原生但需平台原生 DLL。

var lua = new Lua();
lua["myObj"] = new MyClass();                            // 注入对象
lua.RegisterFunction("log", typeof(Debug).GetMethod("Log", ...));  // 注册函数
lua.DoString("myObj:Method()");                          // 执行
var result = lua["my_variable"];                         // 读取全局变量
var table = lua.GetTable("my_table");                    // 读取表

方案对比

维度 MoonSharp NLua
实现方式 纯 C# Lua 解释器 原生 Lua C 库 P/Invoke
AOT/IL2CPP 兼容 好(无原生依赖) 需平台 native DLL
性能 略低于原生 接近原生 Lua
API 风格 DynValue 类型系统,强类型感 动态类型,接近原始 Lua C API 绑定层</td> </tr> <tr> <td>适用场景</td> <td>Unity iOS/IL2CPP、跨平台 .NET</td> <td>Windows/Android 性能优先场景</td> </tr> </tbody> </table> <h3 id="xluatolua">与 xLua/tolua 的区别</h3> <p>[[MoonSharp/NLua 是通用 .NET Lua 桥,适合任意 .NET 项目。xLua/tolua# 是Unity 专用桥,深度集成 Unity 组件生命周期、MonoBehaviour 和 IL2CPP 热补丁机制,工程化程度更高。

来源

  • engine-integration — 游戏引擎集成参考文档,Unity MoonSharp/NLua 集成示例代码段

相关