instanceRoot | 要保存为预制体的 GameObject,并将其制成一个预制体实例。 |
assetPath | 预制体的保存路径。 |
action | 用于此操作的交互模式。 |
success | 保存操作的结果,成功或失败。结合使用控制台日志,以深入了解保存过程。 |
GameObject 已保存预制体资产的根 GameObject(如果可用)。
在给定路径中创建预制体资产,其中包括场景中的任何子项,同时将给定的 GameObject 变为新预制体的实例。
如果某些子项是预制体实例,它们会自动嵌套在新预制体内。
输入对象必须是普通 GameObject,或预制体实例的最外层根对象。它不能是预制体实例中的子项。
如果输入对象是预制体实例根,则生成的预制体会是预制体变量。如果您希望创建一个新的唯一预制体,则首先需要解除预制体实例的打包。
返回的对象是保存后的预置资源的根游戏对象(如果可用)。如果编辑器当前正处于资源编辑批处理操作的中间阶段(通过 AssetDatabase.StartAssetEditing 和 AssetDatabase.StopAssetEditing 来控制),则在资源保存后不会立即导入。在这种情况下,即使保存成功,SaveAsPrefabAsset 也会返回 null,因为保存后的预置资源尚未重新导入,因此尚未可用。
如果保存的是一个现有预置,则 Unity 会尝试保留对预置本身以及预置的各个部分(例如子游戏对象和组件)的引用。要做到这一点,它会匹配新保存的预置与现有预置中的游戏对象的名称。
注意:由于这种匹配仅通过名称进行,因此如果预制的层次结构中有多个具有相同名称的游戏对象,则无法预测将匹配的名称。因此,如果你需要确保在保存现有预制时保留引用,则必须确保预制中的所有游戏对象具有唯一名称。
另请注意:当你保存现有预制时,如果你在预制中的单个游戏对象中附加了多个相同类型的组件,那么在保留对现有组件的引用时可能会遇到类似的问题。在这种情况下,你无法预测其中哪一个将与现有引用匹配。
附加资源:PrefabUtility.SaveAsPrefabAsset 和 解包预制实例。
// 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.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); } }