3.8版本 删除Sprite3D但绑定的物理Component并没删除

原因是因为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);
}
}