Test2.CS
using UnityEngine;
using System.Collections;
using UniLua;
using System;
public class Test2 : MonoBehaviour
{
// 库的名称, 可以是任意字符串
public const string LIB_NAME = "Test2.cs";
public string LuaScriptFile = "framework/lantern.lua";
// 创建 Lua 虚拟机
private ILuaState Lua = LuaAPI.NewState();
private int add;
void Awake()
{
Lua.L_OpenLibs();
Lua.L_RequireF(Test2.LIB_NAME, Test2.OpenLib, false);
var status = Lua.L_DoFile(LuaScriptFile);
if (status != ThreadStatus.LUA_OK)
{
throw new Exception(Lua.ToString(-1));
}
if (!Lua.IsTable(-1))
{
throw new Exception("framework main's return value is not a table");
}
add = StoreMethod("add");
Lua.Pop(1);
}
void OnGUI()
{
if (GUI.Button(new Rect(0, 0, 200, 20), "ADD"))
{
CallMethod(add);
}
}
public static int OpenLib(ILuaState lua) // 库的初始化函数
{
var define = new NameFuncPair[]
{
new NameFuncPair("add", Add),
};
lua.L_NewLib(define);
return 1;
}
public static int Add(ILuaState lua)
{
// 第一个参数
var a = lua.L_CheckNumber(1);
// 第二个参数
var b = lua.L_CheckNumber(2);
// 执行加法操作
var c = a + b;
// 将返回值入栈
lua.PushNumber(c);
// 有一个返回值
return 1;
}
private int StoreMethod(string name)
{
Lua.GetField(-1, name);
if (!Lua.IsFunction(-1))
{
throw new Exception(string.Format("method {0} not found!", name));
}
return Lua.L_Ref(LuaDef.LUA_REGISTRYINDEX);
}
private void CallMethod(int funcRef)
{
Lua.RawGetI(LuaDef.LUA_REGISTRYINDEX, funcRef);
// insert `traceback' function
var b = Lua.GetTop();
Lua.PushCSharpFunction(Traceback);
Lua.Insert(b);
var status = Lua.PCall(0, 0, b);
if (status != ThreadStatus.LUA_OK)
{
Debug.LogError(Lua.ToString(-1));
}
// remove `traceback' function
Lua.Remove(b);
}
private static int Traceback(ILuaState lua)
{
var msg = lua.ToString(1);
if (msg != null)
{
lua.L_Traceback(lua, msg, 1);
}
// is there an error object?
else if (!lua.IsNoneOrNil(1))
{
// try its `tostring' metamethod
if (!lua.L_CallMeta(1, "__tostring"))
{
lua.PushString("(no error message)");
}
}
return 1;
}
}
lantern.lua
--获取库
local test2 = require "Test2.cs"
local function add()
print(test2.add(500,21))
end
return {
add = add,
}