Unity 6.3
0 онлайн 39 гостей 3 в системе
Вход

PrefabUtility.SaveAsPrefabAsset

Declaration

public static GameObject SaveAsPrefabAsset(GameObject instanceRoot, string assetPath);
public static GameObject SaveAsPrefabAsset(GameObject instanceRoot, string assetPath, out bool success);

Параметры

Параметр Описание
instanceRoot GameObject для сохранения как Префаб Ассет.
assetPath Путь, по которому будет сохранен файл префаб. Должен находиться в папке Assets и должен заканчиваться расширением .prefab.
успех Результат действия сохранения, успешное или неудачное. Используйте это вместе с журналом консоли, чтобы получить больше информации о процессе сохранения.

Возвращаемое значение

GameObject Корень GameObject сохраненного Префаб Ассета, если доступен.

Описание

Создает объект Префаб на указанном пути из указанного объекта GameObject, включая любой дочерний объект в Scene без модификации входных объектов.

Если среди дочерних объектов есть экземпляры Prefab, они автоматически станут вложенными в новый ресурс Prefab.

Входной объект должен быть обычным GameObject либо самым внешним корнем экземпляра Prefab. Он не может быть дочерним объектом внутри экземпляра Prefab.

Если входной объект является корнем экземпляра Prefab, результатом будет вариант Prefab. Чтобы вместо него создать новый независимый Prefab, сначала распакуйте экземпляр Prefab.

Возвращаемый объект — это корневой GameObject сохранённого ресурса Prefab, если он доступен. Если Редактор в данный момент выполняет пакетную операцию редактирования ресурсов, управляемую методами AssetDatabase.StartAssetEditing и AssetDatabase.StopAssetEditing, сохранённые ресурсы импортируются не сразу. В таком случае SaveAsPrefabAsset возвращает null даже при успешном сохранении, поскольку сохранённый ресурс Prefab ещё не был повторно импортирован и потому недоступен.

При сохранении поверх существующего Prefab Unity старается сохранить ссылки как на сам Prefab, так и на его отдельные части, например дочерние GameObject и Component. Для этого сопоставляются имена GameObject в новом сохранённом и существующем Prefab.

Примечание: сопоставление выполняется только по имени. Если в иерархии Prefab несколько GameObject имеют одинаковое имя, невозможно предсказать, какой из них будет сопоставлен. Поэтому, если при сохранении поверх существующего Prefab необходимо гарантированно сохранить ссылки, всем GameObject внутри Prefab следует присвоить уникальные имена.

Также учтите: схожая проблема может возникнуть при сохранении ссылок на существующие Component во время сохранения поверх существующего Prefab, если к одному GameObject в Prefab прикреплено несколько Component одного типа. В этом случае невозможно предсказать, какой из них будет сопоставлен с существующими ссылками.

Дополнительные ресурсы: PrefabUtility.SaveAsPrefabAssetAndConnect и Распаковка экземпляров Prefab.

// 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 = "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); } }