Browse Source

Handle enabled/disabled state change.

Aster Jian 12 years ago
parent
commit
241afce241

+ 33 - 1
Source/Extras/LuaScript/LuaScriptInstance.cpp

@@ -92,6 +92,14 @@ void LuaScriptInstance::ApplyAttributes()
     CallScriptObjectFunction(scriptObjectMethodRefs_[LSOM_APPLYATTRIBUTES]);
 }
 
+void LuaScriptInstance::OnSetEnabled()
+{
+    if (enabled_)
+        SubscribeToEvents();    
+    else
+        UnsubscribeFromEvents();
+}
+
 bool LuaScriptInstance::CreateObject(const String& scriptObjectType)
 {
     SetScriptFileName(String::EMPTY);
@@ -305,6 +313,12 @@ void LuaScriptInstance::FindScriptObjectMethodRefs()
     for (unsigned i = 0; i < MAX_LUA_SCRIPT_OBJECT_METHODS; ++i)
         scriptObjectMethodRefs_[i] = luaScript_->GetScriptFunctionRef(scriptObjectType_ + scriptObjectMethodNames[i], true);
 
+    if (enabled_)
+        SubscribeToEvents();
+}
+
+void LuaScriptInstance::SubscribeToEvents()
+{
     if (scriptObjectMethodRefs_[LSOM_UPDATE] != LUA_REFNIL)
         SubscribeToEvent(E_UPDATE, HANDLER(LuaScriptInstance, HandleUpdate));
 
@@ -318,6 +332,21 @@ void LuaScriptInstance::FindScriptObjectMethodRefs()
         SubscribeToEvent(E_PHYSICSPOSTSTEP, HANDLER(LuaScriptInstance, HandlePostFixedUpdate));
 }
 
+void LuaScriptInstance::UnsubscribeFromEvents()
+{
+    if (scriptObjectMethodRefs_[LSOM_UPDATE] != LUA_REFNIL)
+        UnsubscribeFromEvent(E_UPDATE);
+
+    if (scriptObjectMethodRefs_[LSOM_POSTUPDATE] != LUA_REFNIL)
+        UnsubscribeFromEvent(E_POSTUPDATE);
+
+    if (scriptObjectMethodRefs_[LSOM_FIXEDUPDATE] != LUA_REFNIL)
+        UnsubscribeFromEvent(E_PHYSICSPRESTEP);
+
+    if (scriptObjectMethodRefs_[LSOM_FIXEDPOSTUPDATE] != LUA_REFNIL)
+        UnsubscribeFromEvent(E_PHYSICSPOSTSTEP);
+}
+
 void LuaScriptInstance::HandleUpdate(StringHash eventType, VariantMap& eventData)
 {
     using namespace Update;
@@ -375,7 +404,10 @@ void LuaScriptInstance::ReleaseObject()
 {
     if (scriptObjectRef_ == LUA_REFNIL)
         return;
-    
+
+    if (enabled_)
+        UnsubscribeFromEvents();
+
     // Unref script object.
     luaL_unref(luaState_, LUA_REGISTRYINDEX, scriptObjectRef_);
     scriptObjectRef_ = LUA_REFNIL;

+ 6 - 0
Source/Extras/LuaScript/LuaScriptInstance.h

@@ -64,6 +64,8 @@ public:
 
     /// Apply attribute changes that can not be applied immediately. Called after scene load or a network update.
     virtual void ApplyAttributes();
+    /// Handle enabled/disabled state change.
+    virtual void OnSetEnabled();
 
     /// Create script object. Return true if successful.
     bool CreateObject(const String& scriptObjectType);
@@ -106,6 +108,10 @@ public:
 private:
     /// Find script object method refs.
     void FindScriptObjectMethodRefs();
+    /// Subscribe to events.
+    void SubscribeToEvents();
+    /// Unsubscribe from events.
+    void UnsubscribeFromEvents();
     /// Handle the logic update event.
     void HandleUpdate(StringHash eventType, VariantMap& eventData);
     /// Handle the logic post update event.