返回
Lua引擎SLua使用秘笈,史上最通俗易懂教程
见解分享
2023-10-25 11:56:30
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官方文档。