diff --git a/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs b/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs index 13569a891..3f62efae3 100644 --- a/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs @@ -103,25 +103,8 @@ public class MissingScriptEditor : GenericEditor return missingScripts; } - private void ReplaceScript(ScriptType script, bool replaceAllInScene) + private void RunReplacementMulticast(List actions) { - var actions = new List(4); - - List missingScripts = new List(); - if (!replaceAllInScene) - { - missingScripts.Add(Values[0] as MissingScript); - } else - { - missingScripts.AddRange(FindActorsWithMatchingMissingScript()); - } - - foreach (MissingScript missingScript in missingScripts) - { - actions.Add(AddRemoveScript.Add(missingScript.Actor, script)); - actions.Add(AddRemoveScript.Remove(missingScript)); - } - if (actions.Count == 0) { Editor.LogWarning("Failed to replace scripts!"); @@ -138,6 +121,43 @@ public class MissingScriptEditor : GenericEditor } } + private void ReplaceScript(ScriptType script, bool replaceAllInScene) + { + var actions = new List(4); + + List missingScripts = new List(); + if (!replaceAllInScene) + { + missingScripts.Add(Values[0] as MissingScript); + } else + { + missingScripts = FindActorsWithMatchingMissingScript(); + } + + foreach (MissingScript missingScript in missingScripts) + { + AddRemoveScript addReplacementScriptAction = AddRemoveScript.Add(missingScript.Actor, script); + actions.Add(addReplacementScriptAction); + } + RunReplacementMulticast(actions); + + for (int actionIdx = 0; actionIdx < actions.Count; actionIdx++) + { + AddRemoveScript addRemoveScriptAction = (AddRemoveScript) actions[actionIdx]; + int orderInParent = addRemoveScriptAction.GetOrderInParent(); + + Script newScript = missingScripts[actionIdx].Actor.Scripts[orderInParent]; + missingScripts[actionIdx].ReferenceScript = newScript; + } + actions.Clear(); + + foreach (MissingScript missingScript in missingScripts) + { + actions.Add(AddRemoveScript.Remove(missingScript)); + } + RunReplacementMulticast(actions); + } + private void OnReplaceScriptButtonClicked() { var scripts = Editor.Instance.CodeEditing.Scripts.Get(); diff --git a/Source/Editor/Undo/Actions/AddRemoveScriptAction.cs b/Source/Editor/Undo/Actions/AddRemoveScriptAction.cs index a5710494c..86afd4c0b 100644 --- a/Source/Editor/Undo/Actions/AddRemoveScriptAction.cs +++ b/Source/Editor/Undo/Actions/AddRemoveScriptAction.cs @@ -75,6 +75,11 @@ namespace FlaxEditor.Actions _enabled = true; } + public int GetOrderInParent() + { + return _orderInParent; + } + /// /// Creates a new added script undo action. /// @@ -184,6 +189,7 @@ namespace FlaxEditor.Actions script.Parent = parentActor; if (_orderInParent != -1) script.OrderInParent = _orderInParent; + _orderInParent = script.OrderInParent; // Ensure _orderInParent is correct for script that want to use it. if (_prefabObjectId != Guid.Empty) SceneObject.Internal_LinkPrefab(Object.GetUnmanagedPtr(script), ref _prefabId, ref _prefabObjectId); Editor.Instance.Scene.MarkSceneEdited(parentActor.Scene);