Fix prefab root name and transform being changed when applying local changes of sub-object

#3235
This commit is contained in:
Wojtek Figat
2025-08-28 22:26:50 +02:00
parent d0e7bff03a
commit f3d375e356

View File

@@ -254,18 +254,29 @@ namespace FlaxEditor.Modules
PrefabApplying?.Invoke(prefab, instance);
// When applying changes to prefab from actor in level ignore it's root transformation (see ActorEditor.ProcessDiff)
Actor prefabRoot = null;
var originalTransform = instance.LocalTransform;
var originalName = instance.Name;
if (instance.IsPrefabRoot && instance.HasScene)
if (instance.HasScene)
{
instance.LocalTransform = prefab.GetDefaultInstance().Transform;
instance.Name = prefab.GetDefaultInstance().Name;
prefabRoot = instance.GetPrefabRoot();
if (prefabRoot != null && prefabRoot.IsPrefabRoot && instance.HasScene)
{
var defaultInstance = prefab.GetDefaultInstance();
originalTransform = prefabRoot.LocalTransform;
originalName = prefabRoot.Name;
prefabRoot.LocalTransform = defaultInstance.Transform;
prefabRoot.Name = defaultInstance.Name;
}
}
// Call backend
var failed = PrefabManager.Internal_ApplyAll(FlaxEngine.Object.GetUnmanagedPtr(instance));
instance.LocalTransform = originalTransform;
instance.Name = originalName;
if (prefabRoot != null)
{
prefabRoot.LocalTransform = originalTransform;
prefabRoot.Name = originalName;
}
if (failed)
throw new Exception("Failed to apply the prefab. See log to learn more.");