浏览代码

Add get Lua attribute name in C++, not finish.[ci skip]

Aster Jian 11 年之前
父节点
当前提交
5805f7027c

+ 29 - 1
Source/Engine/LuaScript/LuaScriptInstance.cpp

@@ -147,6 +147,8 @@ void LuaScriptInstance::SetScriptObjectType(const String& scriptObjectType)
 
     ReleaseObject();
 
+    int top = lua_gettop(luaState_);
+
     WeakPtr<LuaFunction> function = luaScript_->GetFunction("CreateScriptObjectInstance");
     if (!function || !function->BeginCall())
         return;
@@ -154,11 +156,37 @@ void LuaScriptInstance::SetScriptObjectType(const String& scriptObjectType)
     function->PushLuaTable(scriptObjectType);
     function->PushUserType((void*)this, "LuaScriptInstance");
     
-    if (!function->EndCall(1))
+    // Return script object and attribute names
+    if (!function->EndCall(2))
         return;
 
     scriptObjectType_ = scriptObjectType;
     scriptObjectRef_ = luaL_ref(luaState_, LUA_REGISTRYINDEX);
+    
+    // Get all attribute names
+    Vector<String> attributeNames;
+    if (lua_istable(luaState_, -1))
+    {
+        int length = lua_objlen(luaState_, -1);
+        for (int i = 1; i <= length; ++i)
+        {
+            lua_pushinteger(luaState_, i);
+            lua_gettable(luaState_, -2);
+
+            if (!lua_isstring(luaState_, -1))
+            {
+                lua_pop(luaState_, 1);
+                continue;
+            }
+
+            String name = lua_tostring(luaState_, -1);
+            attributeNames.Push(name);
+
+            lua_pop(luaState_, 1);
+        }
+    }
+
+    lua_settop(luaState_, top);
 
     // Find script object method refs
     FindScriptObjectMethodRefs();

+ 16 - 4
Source/Engine/LuaScript/pkgs/LuaScript/LuaScriptInstance.pkg

@@ -14,7 +14,7 @@ class LuaScriptInstance : public Component
     void ScriptUnsubscribeFromEvents @ UnsubscribeFromEvents(void* sender);
     const String GetScriptFileName() const;
     const String GetScriptObjectType() const;
-    
+
     tolua_property__get_set const String scriptFileName;
     tolua_property__get_set const String scriptObjectType;
 };
@@ -33,7 +33,7 @@ function LuaScriptObject:GetNode()
 end
 
 function LuaScriptObject:SubscribeToEvent(param1, param2, param3)
-    local instance = self.instance    
+    local instance = self.instance
     if instance == nil then
         return
     end
@@ -90,11 +90,23 @@ function CreateScriptObjectInstance(object, instance)
     instance.object = o
     o.instance = instance
     o.node = instance:GetNode()
-    
+
+    local existKeys = {}
+    for k, v in pairs(o) do
+        existKeys[k] = true
+    end
+
     -- Call start function
     o:Start()
+
+    local attrNames = {}
+    for k, v in pairs(o) do
+        if existKeys[k] == nil then
+            table.insert(attrNames, k)
+        end
+    end
     
-    return o
+    return attrNames, o
 end
 
 function DestroyScriptObjectInstance(instance)