138 lines
3.5 KiB
C#
138 lines
3.5 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|