using NLua; using System; namespace PSO2SERVER.LuaScriptEngine { public class LuaEngine { private Lua lua; public LuaEngine() { // 初始化 LuaEngine 解释器 lua = new Lua(); } // 执行 LuaEngine 脚本 public void ExecuteScript(string script) { try { // 执行传入的 LuaEngine 脚本 lua.DoString(script); } catch (Exception ex) { Console.WriteLine("Error executing LuaEngine script: " + ex.Message); } } // 执行并获取 LuaEngine 脚本结果 public object ExecuteScriptWithResult(string script) { try { // 执行 LuaEngine 脚本并返回结果 return lua.DoString(script)[0]; } catch (Exception ex) { Console.WriteLine("Error executing LuaEngine script: " + ex.Message); return null; } } // 将 C# 对象传递给 LuaEngine 环境 public void SetGlobalVariable(string name, object value) { lua[name] = value; } // 获取 LuaEngine 环境中的全局变量 public object GetGlobalVariable(string name) { return lua[name]; } // 使用 MethodBase 注册方法 public void RegisterFunction(object obj, string luaFunctionName, string methodName) { var methodInfo = obj.GetType().GetMethod(methodName); lua.RegisterFunction(luaFunctionName, obj, methodInfo); } // 注册委托函数到 Lua public void RegisterFunction(string luaFunctionName, Delegate function) { // 使用反射将委托作为方法注册 var method = function.Method; lua.RegisterFunction(luaFunctionName, null, method); } // 清理 Lua 环境 public void Close() { lua.Close(); } // 清理 LuaEngine 解释器 public void Dispose() { lua.Dispose(); } // 示例方法 public int AddNumbers(int a, int b) { return a + b; } // 示例方法 public void print(string text, params object[] args) { Logger.Write(text, args); } public void printobj(object obj) { Logger.WriteObj(obj); } // 注册函数 public void RegisterExampleFunction() { // 使用反射将方法注册到 Lua RegisterFunction(this, "AddNumbers", "AddNumbers"); } public void RegisterLogger() { // 使用反射将方法注册到 Lua RegisterFunction(this, "print", "print"); RegisterFunction(this, "printobj", "printobj"); } public void LusTest() { var engine = new LuaEngine(); engine.RegisterLogger(); // 注册 C# 函数到 Lua engine.RegisterExampleFunction(); // Lua 脚本 string luaScript = @" -- 调用 C# 注册的函数 result = AddNumbers(10, 20) print('Result from C#: ' .. result) printobj(result) "; // 执行 Lua 脚本 engine.ExecuteScript(luaScript); // 关闭 Lua 环境 engine.Close(); } } }