diff --git a/Source/Editor/Content/GUI/ContentView.DragDrop.cs b/Source/Editor/Content/GUI/ContentView.DragDrop.cs index 3c0993b93..348e2b443 100644 --- a/Source/Editor/Content/GUI/ContentView.DragDrop.cs +++ b/Source/Editor/Content/GUI/ContentView.DragDrop.cs @@ -45,8 +45,14 @@ namespace FlaxEditor.Content.GUI private void ImportActors(DragActors actors, ContentFolder location) { - // Use only the first actor - Editor.Instance.Prefabs.CreatePrefab(actors.Objects[0].Actor); + foreach (var actorNode in actors.Objects) + { + var actor = actorNode.Actor; + if (actors.Objects.Contains(actorNode.ParentNode as ActorNode)) + continue; + + Editor.Instance.Prefabs.CreatePrefab(actor, false); + } } /// diff --git a/Source/Editor/Modules/PrefabsModule.cs b/Source/Editor/Modules/PrefabsModule.cs index ed422e991..7b3ffebb3 100644 --- a/Source/Editor/Modules/PrefabsModule.cs +++ b/Source/Editor/Modules/PrefabsModule.cs @@ -37,6 +37,11 @@ namespace FlaxEditor.Modules /// public event Action PrefabApplied; + /// + /// Locally cached actor for prefab creation. + /// + private Actor _prefabCreationActor; + internal PrefabsModule(Editor editor) : base(editor) { @@ -78,6 +83,16 @@ namespace FlaxEditor.Modules /// /// The root prefab actor. public void CreatePrefab(Actor actor) + { + CreatePrefab(actor, true); + } + + /// + /// Starts the creating prefab for the given actor by showing the new item creation dialog in . + /// + /// The root prefab actor. + /// Allow renaming or not + public void CreatePrefab(Actor actor, bool rename) { // Skip in invalid states if (!Editor.StateMachine.CurrentState.CanEditContent) @@ -90,7 +105,8 @@ namespace FlaxEditor.Modules PrefabCreating?.Invoke(actor); var proxy = Editor.ContentDatabase.GetProxy(); - Editor.Windows.ContentWin.NewItem(proxy, actor, OnPrefabCreated, actor.Name); + _prefabCreationActor = actor; + Editor.Windows.ContentWin.NewItem(proxy, actor, OnPrefabCreated, actor.Name, rename); } private void OnPrefabCreated(ContentItem contentItem) @@ -107,25 +123,21 @@ namespace FlaxEditor.Modules // Record undo for prefab creating (backend links the target instance with the prefab) if (Editor.Undo.Enabled) { - var selection = Editor.SceneEditing.Selection.Where(x => x is ActorNode).ToList().BuildNodesParents(); - if (selection.Count == 0) + if (!_prefabCreationActor) return; - if (selection.Count == 1) + var actorsList = new List(); + Utilities.Utils.GetActorsTree(actorsList, _prefabCreationActor); + + var actions = new IUndoAction[actorsList.Count]; + for (int i = 0; i < actorsList.Count; i++) { - var action = BreakPrefabLinkAction.Linked(((ActorNode)selection[0]).Actor); - Undo.AddAction(action); - } - else - { - var actions = new IUndoAction[selection.Count]; - for (int i = 0; i < selection.Count; i++) - { - var action = BreakPrefabLinkAction.Linked(((ActorNode)selection[i]).Actor); - actions[i] = action; - } - Undo.AddAction(new MultiUndoAction(actions)); + var action = BreakPrefabLinkAction.Linked(actorsList[i]); + actions[i] = action; } + Undo.AddAction(new MultiUndoAction(actions)); + + _prefabCreationActor = null; } Editor.Instance.Windows.PropertiesWin.Presenter.BuildLayout();