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();