public static void OpenLibs(IntPtr L) { LuaDLL.lua_getglobal(L, "tolua"); LuaDLL.lua_pushstring(L, "isnull"); LuaDLL.lua_pushcfunction(L, IsNull); LuaDLL.lua_rawset(L, -3); LuaDLL.lua_pushstring(L, "tolstring"); LuaDLL.tolua_pushcfunction(L, BufferToString); LuaDLL.lua_rawset(L, -3); LuaDLL.lua_pushstring(L, "typeof"); LuaDLL.lua_pushcfunction(L, GetClassType); LuaDLL.lua_rawset(L, -3); //手动模拟gc //LuaDLL.lua_pushstring(L, "collect"); //LuaDLL.lua_pushcfunction(L, Collect); //LuaDLL.lua_rawset(L, -3); int meta = LuaStatic.GetMetaReference(L, typeof(NullObject)); LuaDLL.lua_pushstring(L, "null"); LuaDLL.tolua_pushnewudata(L, meta, 1); LuaDLL.lua_rawset(L, -3); LuaDLL.lua_pop(L, 1); LuaDLL.tolua_pushudata(L, 1); LuaDLL.lua_setfield(L, LuaIndexes.LUA_GLOBALSINDEX, "null"); }
//o 不为 null static void PushUserObject(IntPtr L, object o) { Type type = o.GetType(); int reference = LuaStatic.GetMetaReference(L, type); if (reference > 0) { PushUserData(L, o, reference); } else { PushPreLoadType(L, o, type); } }
public static void PushValue(IntPtr L, ValueType v) { if (v == null) { LuaDLL.lua_pushnil(L); return; } Type type = v.GetType(); int reference = LuaStatic.GetMetaReference(L, type); ObjectTranslator translator = ObjectTranslator.Get(L); if (reference > 0) { int index = translator.AddObject(v); LuaDLL.tolua_pushnewudata(L, reference, index); } else { LuaCSFunction LuaOpenLib = LuaStatic.GetPreModule(L, type); if (LuaOpenLib != null) { #if UNITY_EDITOR lhDebug.LogWarning("register PreLoad type {0} to lua", LuaMisc.GetTypeName(type)); #endif LuaOpenLib(L); reference = LuaStatic.GetMetaReference(L, type); if (reference > 0) { int index = translator.AddObject(v); LuaDLL.tolua_pushnewudata(L, reference, index); return; } } //类型未Wrap LuaDLL.lua_pushnil(L); lhDebug.LogError("Type {0} not wrap to lua", LuaMisc.GetTypeName(type)); } }
static void PushPreLoadType(IntPtr L, object o, Type type) { LuaCSFunction LuaOpenLib = LuaStatic.GetPreModule(L, type); if (LuaOpenLib != null) { #if UNITY_EDITOR lhDebug.LogWarning("register PreLoad type {0} to lua", LuaMisc.GetTypeName(type)); #endif LuaPCall(L, LuaOpenLib); int reference = LuaStatic.GetMetaReference(L, type); if (reference > 0) { PushUserData(L, o, reference); return; } } //类型未Wrap LuaDLL.lua_pushnil(L); lhDebug.LogError("Type {0} not wrap to lua", LuaMisc.GetTypeName(type)); }