Documentation

Unity Engine


User Manual

Script Reference

Unity Engine


SaveAsPrefabAsset

Creates a Prefab Asset at the given path from the given GameObject, including any childen in the Scene without modifying the input objects.
Read time 6 minutesLast updated 12 days ago

Definition

  • Type: Method
  • Namespace: UnityEditor
  • Assembly: UnityEditor.CoreModule

SaveAsPrefabAsset(GameObject, string, bool)

Creates a Prefab Asset at the given path from the given GameObject, including any childen in the Scene without modifying the input objects.
public static GameObject SaveAsPrefabAsset(GameObject instanceRoot, string assetPath, out bool success)

Parameters

instanceRoot

The GameObject to save as a Prefab Asset.

assetPath

The path at which to save the prefab. Must be within the
Assets
folder and must end with the extension
.prefab
.

success

The result of the save action, either successful or unsuccessful. Use this together with the console log to get more insight into the save process.

Returns

Type

Description

GameObjectThe root GameObject of the saved Prefab Asset, if available.

Remarks

In case some of the children are Prefab instances they will automatically become nested inside the new Prefab Asset.
The input object must be a plain GameObject or the outermost root of a Prefab Instance. It cannot be a child inside a Prefab instance.
If the input object is a Prefab instance root the resulting Prefab will be a Prefab Variant. If you want to create a new unique Prefab instead, you need to unpack the Prefab instance first.
The returned object is the root GameObject of the saved Prefab Asset, if available. If the Editor is currently in the middle of an asset editing batch operation, as controlled with AssetDatabase.StartAssetEditing and AssetDatabase.StopAssetEditing, assets are not immediately imported upon being saved. In this case, PrefabUtility.SaveAsPrefabAsset will return null even if the save was successful because the saved Prefab Asset was not yet reimported and thus not yet available.
If you are saving over an existing Prefab, Unity tries to preserve references to the Prefab itself and the individual parts of the Prefab such as child GameObjects and Components. To do this, it matches the names of GameObjects between the new saved Prefab and the existing Prefab.
Note: Because this matching is done by name only, if there are multiple GameObjects with the same name in the Prefab's hierarchy, you cannot predict which will be matched. Therefore if you need to ensure your references are preserved when saving over an existing prefab, you must ensure all GameObjects within the Prefab have unique names.
Also note: You may encounter a similar problem in the case of preserving references to existing Components when you save over an existing Prefab, if a single GameObject within the Prefab has more than one of the same Component type attached. In this case you cannot predict which of them will be matched to the existing references.

Examples

// This script creates a new menu item Examples>Create Prefab in the main menu.// Use it to create Prefab(s) from the selected GameObject(s).// Prefab(s) are placed in the "Prefabs" folder.using System.IO;using UnityEngine;using UnityEditor;public class Example{ // Creates a new menu item 'Examples > Create Prefab' in the main menu. [MenuItem("Examples/Create Prefab")] static void CreatePrefab() { // Keep track of the currently selected GameObject(s) GameObject[] objectArray = Selection.gameObjects; // Loop through every GameObject in the array above foreach (GameObject gameObject in objectArray) { // Create folder Prefabs and set the path as within the Prefabs folder, // and name it as the GameObject's name with the .Prefab format if (!Directory.Exists("Assets/Prefabs")) AssetDatabase.CreateFolder("Assets", "Prefabs"); string localPath = "AssetsPrefabs" + gameObject.name + ".prefab"; // Make sure the file name is unique, in case an existing Prefab has the same name. localPath = AssetDatabase.GenerateUniqueAssetPath(localPath); // Create the new Prefab and log whether Prefab was saved successfully. bool prefabSuccess; PrefabUtility.SaveAsPrefabAsset(gameObject, localPath, out prefabSuccess); if (prefabSuccess == true) Debug.Log("Prefab was saved successfully"); else Debug.Log("Prefab failed to save" + prefabSuccess); } } // Disable the menu item if no selection is in place. [MenuItem("Examples/Create Prefab", true)] static bool ValidateCreatePrefab() { return Selection.activeGameObject != null && !EditorUtility.IsPersistent(Selection.activeGameObject); }}

SaveAsPrefabAsset(GameObject, string)

Creates a Prefab Asset at the given path from the given GameObject, including any childen in the Scene without modifying the input objects.
public static GameObject SaveAsPrefabAsset(GameObject instanceRoot, string assetPath)

Parameters

instanceRoot

The GameObject to save as a Prefab Asset.

assetPath

The path at which to save the prefab. Must be within the
Assets
folder and must end with the extension
.prefab
.

Returns

Type

Description

GameObjectThe root GameObject of the saved Prefab Asset, if available.

Remarks

In case some of the children are Prefab instances they will automatically become nested inside the new Prefab Asset.
The input object must be a plain GameObject or the outermost root of a Prefab Instance. It cannot be a child inside a Prefab instance.
If the input object is a Prefab instance root the resulting Prefab will be a Prefab Variant. If you want to create a new unique Prefab instead, you need to unpack the Prefab instance first.
The returned object is the root GameObject of the saved Prefab Asset, if available. If the Editor is currently in the middle of an asset editing batch operation, as controlled with AssetDatabase.StartAssetEditing and AssetDatabase.StopAssetEditing, assets are not immediately imported upon being saved. In this case, PrefabUtility.SaveAsPrefabAsset will return null even if the save was successful because the saved Prefab Asset was not yet reimported and thus not yet available.
If you are saving over an existing Prefab, Unity tries to preserve references to the Prefab itself and the individual parts of the Prefab such as child GameObjects and Components. To do this, it matches the names of GameObjects between the new saved Prefab and the existing Prefab.
Note: Because this matching is done by name only, if there are multiple GameObjects with the same name in the Prefab's hierarchy, you cannot predict which will be matched. Therefore if you need to ensure your references are preserved when saving over an existing prefab, you must ensure all GameObjects within the Prefab have unique names.
Also note: You may encounter a similar problem in the case of preserving references to existing Components when you save over an existing Prefab, if a single GameObject within the Prefab has more than one of the same Component type attached. In this case you cannot predict which of them will be matched to the existing references.

Examples

// This script creates a new menu item Examples>Create Prefab in the main menu.// Use it to create Prefab(s) from the selected GameObject(s).// Prefab(s) are placed in the "Prefabs" folder.using System.IO;using UnityEngine;using UnityEditor;public class Example{ // Creates a new menu item 'Examples > Create Prefab' in the main menu. [MenuItem("Examples/Create Prefab")] static void CreatePrefab() { // Keep track of the currently selected GameObject(s) GameObject[] objectArray = Selection.gameObjects; // Loop through every GameObject in the array above foreach (GameObject gameObject in objectArray) { // Create folder Prefabs and set the path as within the Prefabs folder, // and name it as the GameObject's name with the .Prefab format if (!Directory.Exists("Assets/Prefabs")) AssetDatabase.CreateFolder("Assets", "Prefabs"); string localPath = "AssetsPrefabs" + gameObject.name + ".prefab"; // Make sure the file name is unique, in case an existing Prefab has the same name. localPath = AssetDatabase.GenerateUniqueAssetPath(localPath); // Create the new Prefab and log whether Prefab was saved successfully. bool prefabSuccess; PrefabUtility.SaveAsPrefabAsset(gameObject, localPath, out prefabSuccess); if (prefabSuccess == true) Debug.Log("Prefab was saved successfully"); else Debug.Log("Prefab failed to save" + prefabSuccess); } } // Disable the menu item if no selection is in place. [MenuItem("Examples/Create Prefab", true)] static bool ValidateCreatePrefab() { return Selection.activeGameObject != null && !EditorUtility.IsPersistent(Selection.activeGameObject); }}