返回

Lua引擎SLua使用秘笈,史上最通俗易懂教程

见解分享

Lua如何调用Unity引擎中的方法

上一篇文章里主要讲了如何在Unity里引用SLua读取lua脚本,这一篇主要讲Lua如何调用Unity引擎中的方法。下一篇文章讲开发一个中间层,把Start、Awake、Update等方法传递到Lua中,最终完成一个纯Lua项目。

首先,需要在Unity项目中注册C#类和方法。
以Time.deltaTime为例。

//lua_register_delegate
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
public static int get_deltaTime(IntPtr L)
{
    LuaDLL.lua_pushnumber(L, Time.deltaTime);
    return 1;
}

也可以创建自定义类型。比如创建Vector3类型。

[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
public static int get_Vector3(IntPtr L)
{
    int index = LuaDLL.luaL_checkinteger(L, 1);
    //LuaStack.lua_gettop returns the index of the top element in the stack
    //minus 1 returns the number of elements
    //this code returns the number of arguments passed to the lua function
    int num = LuaStack.lua_gettop(L) - 1;
    if(index==1 && num==3)
    {
        float x = (float)LuaDLL.lua_tonumber(L, 2);
        float y = (float)LuaDLL.lua_tonumber(L, 3);
        float z = (float)LuaDLL.lua_tonumber(L, 4);
        Vector3 pos = new Vector3(x, y, z);
        LuaDLL.lua_pushlightuserdata(L, pos);
        LuaDLL.luaL_getmetatable(L, "Vector3");
        LuaDLL.lua_setmetatable(L, -2);
        return 1;
    }
    return 0;
}
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
public static int get_x(IntPtr L)
{
    Vector3 pos = (Vector3)LuaDLL.lua_touserdata(L, 1);
    LuaDLL.lua_pushnumber(L, pos.x);
    return 1;
}
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
public static int get_y(IntPtr L)
{
    Vector3 pos = (Vector3)LuaDLL.lua_touserdata(L, 1);
    LuaDLL.lua_pushnumber(L, pos.y);
    return 1;
}
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
public static int get_z(IntPtr L)
{
    Vector3 pos = (Vector3)LuaDLL.lua_touserdata(L, 1);
    LuaDLL.lua_pushnumber(L, pos.z);
    return 1;
}

然后,将注册的C#类和方法添加到SLua中。

CSharpCallLua.luaopen_custom(L);

最后,就可以从Lua脚本中调用C#方法了。

-- get Time.deltaTime
local deltaTime = UnityEngine.Time.deltaTime

-- get Vector3(1,2,3)
local v = Vector3(1,2,3)
-- call v.x
local x = v.x

结语

通过上面的步骤,就可以轻松实现Lua调用Unity引擎中的方法了。同时,SLua还支持更多的特性,如类型映射、事件分发、协程等。想要了解更多,可以参考SLua官方文档。