Объявление
public static GameObject SaveAsPrefabAssetAndConnect(GameObject instanceRoot, string assetPath, InteractionMode action);public static GameObject SaveAsPrefabAssetAndConnect(GameObject instanceRoot, string assetPath, InteractionMode action, out bool success);
Параметры
instanceRoot | GameObject, который необходимо сохранить как Prefab и превратить в экземпляр Prefab. |
assetPath | Путь для сохранения префаба. |
action | Режим взаимодействия, используемый для этого действия. |
success | Результат действия сохранения, успешный или неуспешный. Используйте это вместе с журналом консоли, чтобы лучше понять процесс сохранения. |
Возвращает
GameObject Корневой GameObject сохраненного Prefab Asset, если он доступен.
Описание
Используйте эту функцию, чтобы создать Prefab Asset по заданному пути от данного GameObject, включая любые дочерние элементы в Scene, и в то же время сделать данный GameObject экземпляром нового Prefab.
Если некоторые из дочерних элементов являются экземплярами Prefab, они автоматически становятся вложенными в новый Prefab.
Входной объект должен быть простым GameObject или самым внешним корнем Prefab Instance. Он не может быть дочерним элементом внутри экземпляра Prefab.
Если входной объект является корневым экземпляром префаба, результирующий префаб будет вариантом префаба. Если вместо этого вы хотите создать новый уникальный префаб, вам нужно сначала распаковать экземпляр префаба.
Возвращенный объект является корневым игровым объектом сохраненного префаб-ассета, если он доступен. Если редактор в настоящее время выполняет пакетную операцию редактирования актива, что контролируется с помощью AssetDatabase.StartAssetEditing и AssetDatabase.StopAssetEditing< /a> активы не импортируются сразу после сохранения. В этом случае SaveAsPrefabAsset вернет значение null, даже если сохранение прошло успешно, потому что сохраненный Prefab Asset еще не был повторно импортирован и, следовательно, еще не доступен.
Если вы сохраняете поверх существующего префаба, Unity пытается сохранить ссылки на сам префаб и отдельные части префаба, такие как дочерние игровые объекты и компоненты. Для этого он сопоставляет имена игровых объектов между новым сохраненным префабом и существующим префабом.
Примечание. Поскольку это сопоставление выполняется только по имени, если в иерархии префаба есть несколько игровых объектов с одинаковым именем, вы не можете предсказать, какие из них будут сопоставлены. Поэтому, если вам нужно обеспечить сохранение ваших ссылок при сохранении поверх существующего префаба, вы должны убедиться, что все игровые объекты внутри префаба имеют уникальные имена.
Также обратите внимание: вы можете столкнуться с похожей проблемой в случае сохранения ссылок на существующие компоненты при сохранении поверх существующего префаба, если к одному игровому объекту в префабе прикреплено более одного компонента одного типа. В этом случае вы не можете предсказать, какие из них будут сопоставлены с существующими ссылками.
Смотрите так же: PrefabUtility.SaveAsPrefabAsset 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.SaveAsPrefabAssetAndConnect(gameObject, localPath, InteractionMode.UserAction, 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);
}
}