diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.cpp index 766a293b4a..83a76aeb01 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.cpp @@ -187,13 +187,14 @@ namespace AzToolsFramework return removedEntity; } - void Instance::DetachNestedEntities(const AZStd::function)>& callback) + void Instance::DetachAllEntitiesInHierarchy(const AZStd::function)>& callback) { + callback(AZStd::move(DetachContainerEntity())); DetachEntities(callback); for (const auto& [instanceAlias, instance] : m_nestedInstances) { - instance->DetachNestedEntities(callback); + instance->DetachAllEntitiesInHierarchy(callback); } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.h index d14203e2e5..bba20cbe8a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/Instance.h @@ -87,7 +87,14 @@ namespace AzToolsFramework bool AddEntity(AZ::Entity& entity, EntityAlias entityAlias); AZStd::unique_ptr DetachEntity(const AZ::EntityId& entityId); void DetachEntities(const AZStd::function)>& callback); - void DetachNestedEntities(const AZStd::function)>& callback); + + /** + * Detaches all entities in the instance hierarchy, including; all direct and nested entities, all container entities. + * Note that without container entities the hierarchy that remains cannot be used further without restoring new ones + * @param callback A user provided callback that can be used to capture ownership and manipulate the detached entities. + */ + void DetachAllEntitiesInHierarchy(const AZStd::function)>& callback); + void RemoveNestedEntities(const AZStd::function&)>& filter); void Reset(); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/SpawnableUtils.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/SpawnableUtils.cpp index 3c91f99b05..241d2a3bd5 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/SpawnableUtils.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Spawnable/SpawnableUtils.cpp @@ -38,11 +38,7 @@ namespace AzToolsFramework::Prefab::SpawnableUtils // going to be used to create clones of the entities. { AzFramework::Spawnable::EntityList& entities = spawnable.GetEntities(); - if (instance.HasContainerEntity()) - { - entities.emplace_back(AZStd::move(instance.DetachContainerEntity())); - } - instance.DetachNestedEntities( + instance.DetachAllEntitiesInHierarchy( [&entities](AZStd::unique_ptr entity) { entities.emplace_back(AZStd::move(entity));