Объявление
public static GameObject SaveAsPrefabAsset(GameObject instanceRoot, string assetPath);public static GameObject SaveAsPrefabAsset(GameObject instanceRoot, string assetPath, out bool success);
Параметры
instanceRoot | GameObject для сохранения в качестве Prefab Asset. |
assetPath | Путь для сохранения префаба. |
success | Результат действия сохранения, успешный или неуспешный. Используйте это вместе с журналом консоли, чтобы лучше понять процесс сохранения. |
Возвращает
GameObject Корневой GameObject сохраненного Prefab Asset, если он доступен.
Описание
Используйте эту функцию для создания Prefab Asset по указанному пути от заданного GameObject, включая любые дочерние элементы в сцене, без изменения входных объектов.
Если некоторые из дочерних элементов являются экземплярами Prefab, они автоматически становятся вложенными в новый Prefab Asset.
Входной объект должен быть простым GameObject или самым внешним корнем Prefab Instance. Он не может быть дочерним элементом внутри экземпляра Prefab.
Если входной объект является корневым экземпляром префаба, результирующий префаб будет вариантом префаба. Если вместо этого вы хотите создать новый уникальный префаб, вам нужно сначала распаковать экземпляр префаба.
Возвращенный объект является корневым игровым объектом сохраненного префаб-ассета, если он доступен. Если редактор в данный момент находится в середине пакетной операции редактирования актива, управляемой с помощью AssetDatabase.StartAssetEditing и AssetDatabase.StopAssetEditing активы не импортируются сразу после сохранения. В этом случае SaveAsPrefabAsset вернет значение null, даже если сохранение прошло успешно, потому что сохраненный Prefab Asset еще не был повторно импортирован и, следовательно, еще не доступен.
Если вы сохраняете поверх существующего префаба, Unity пытается сохранить ссылки на сам префаб и отдельные части префаба, такие как дочерние игровые объекты и компоненты. Для этого он сопоставляет имена игровых объектов между новым сохраненным префабом и существующим префабом.
Примечание. Поскольку это сопоставление выполняется только по имени, если в иерархии префаба есть несколько игровых объектов с одинаковым именем, вы не можете предсказать, какие из них будут сопоставлены. Поэтому, если вам нужно обеспечить сохранение ваших ссылок при сохранении поверх существующего префаба, вы должны убедиться, что все игровые объекты внутри префаба имеют уникальные имена.
Также обратите внимание: вы можете столкнуться с похожей проблемой в случае сохранения ссылок на существующие компоненты при сохранении поверх существующего префаба, если к одному игровому объекту в префабе прикреплено более одного компонента одного типа. В этом случае вы не можете предсказать, какие из них будут сопоставлены с существующими ссылками.
Смотрите так же: PrefabUtility.SaveAsPrefabAssetAndConnect and Unpacking Prefab instances.
// Этот скрипт создает новый пункт меню Examples>Create Prefab в главном меню.
// Используйте его для создания Prefab(s) из выбранных GameObject(s).
// Префабы помещаются в папку «Префабы».
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 = "Assets/Prefabs/" + 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);
}
}