原因是因为Node::removeAllComponents里面释放所有Component时没有调用Component的onExit函数。
修改如下:
CCNode.cpp
bool Node::removeComponent(const std::string& name)
{
if (_componentContainer)
return _componentContainer->remove(name, _running);
return false;
}
bool Node::removeComponent(Component *component)
{
if (_componentContainer)
{
return _componentContainer->remove(component, _running);
}
return false;
}
void Node::removeAllComponents()
{
if (_componentContainer)
_componentContainer->removeAll(_running);
}
CCComponentContainer.cpp
bool ComponentContainer::remove(const std::string& name, bool running)
{
bool ret = false;
do
{
CC_BREAK_IF(!_components);
auto iter = _components->find(name);
CC_BREAK_IF(iter == _components->end());
auto com = iter->second;
if (running)
{
com->onExit();
}
com->onRemove();
com->setOwner(nullptr);
_components->erase(iter);
ret = true;
} while(0);
return ret;
}
bool ComponentContainer::remove(Component *com, bool running)
{
bool ret = false;
do
{
CC_BREAK_IF(!_components);
for (auto iter = _components->begin(); iter != _components->end(); ++iter)
{
if (iter->second == com)
{
if (running)
{
com->onExit();
}
com->onRemove();
com->setOwner(nullptr);
_components->erase(iter);
break;
}
}
ret = true;
} while(0);
return ret;
}
void ComponentContainer::removeAll(bool running)
{
if (_components != nullptr)
{
for (auto iter = _components->begin(); iter != _components->end(); ++iter)
{
if (running)
{
iter->second->onExit();
}
iter->second->onRemove();
iter->second->setOwner(nullptr);
}
_components->clear();
CC_SAFE_DELETE(_components);
_owner->unscheduleUpdate();
}
}
CCPhysics3DComponent.cpp
void Physics3DComponent::setEnabled(bool b)
{
//bool oldBool = b;
bool oldBool = _enabled; //这里都无语了
Component::setEnabled(b);
if (_physics3DObj && oldBool != _enabled)
{
_enabled ? _physics3DObj->getPhysicsWorld()->addPhysics3DObject(_physics3DObj) : _physics3DObj->getPhysicsWorld()->removePhysics3DObject(_physics3DObj);
}
}