From f3d375e35668d8064e266e99d6a32d318f0e6a92 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 28 Aug 2025 22:26:50 +0200 Subject: [PATCH] Fix prefab root name and transform being changed when applying local changes of sub-object #3235 --- Source/Editor/Modules/PrefabsModule.cs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Source/Editor/Modules/PrefabsModule.cs b/Source/Editor/Modules/PrefabsModule.cs index 617202062..f7b984056 100644 --- a/Source/Editor/Modules/PrefabsModule.cs +++ b/Source/Editor/Modules/PrefabsModule.cs @@ -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.");