版本: Unity 6 (6000.0)
语言英语
  • C#

PrefabUtility.SaveAsPrefabAsset

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法采纳所有提交,但我们会阅读用户提出的每个更改建议,并在适用的情况下进行更新。

关闭

提交失败

由于某些原因,您的更改建议无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

public static GameObject SaveAsPrefabAsset(GameObject instanceRoot, string assetPath);

声明

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

参数

instanceRoot 要保存为预制资源的 GameObject。
assetPath 保存预制资源的路径。
success 保存操作的结果,成功或失败。将其与控制台日志结合使用,以更深入地了解保存过程。

返回值

GameObject 保存的预制资源的根 GameObject(如果可用)。

描述

根据给定的 GameObject 在给定路径下创建预制资源,包括场景中的任何子对象,而不会修改输入对象。

如果某些子对象是预制实例,它们将自动嵌套在新预制资源中。

输入对象必须是普通 GameObject 或预制实例的最外层根。它不能是预制实例内的子对象。

如果输入对象是预制实例根,则生成的预制将是预制变体。如果您想创建一个新的唯一预制,则需要先解包预制实例。

返回的对象是保存的预制资源的根 GameObject(如果可用)。如果编辑器当前处于资产编辑批处理操作的中间,由AssetDatabase.StartAssetEditingAssetDatabase.StopAssetEditing控制,则保存后不会立即导入资产。在这种情况下,即使保存成功,SaveAsPrefabAsset 也会返回 null,因为保存的预制资源尚未重新导入,因此尚不可用。

如果您要覆盖现有的预制,Unity 会尝试保留对预制本身以及预制各个部分(如子 GameObject 和组件)的引用。为此,它会匹配新保存的预制和现有预制之间 GameObject 的名称。

注意:由于此匹配仅通过名称进行,如果预制层次结构中有多个具有相同名称的 GameObject,则无法预测将匹配哪个。因此,如果您需要确保在覆盖现有预制时保留引用,则必须确保预制中的所有 GameObject 具有唯一的名称。

另请注意:如果您在覆盖现有预制时保留对现有组件的引用,也可能会遇到类似的问题,如果预制中的单个 GameObject 附加了多个相同类型的组件。在这种情况下,您无法预测哪些组件将与现有引用匹配。

其他资源:PrefabUtility.SaveAsPrefabAssetAndConnect解包预制实例

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