版本:Unity 6(6000.0)
语言简体中文
  • C#

PrefabUtility.RevertRemovedGameObject

建议更改

成功!

感谢你帮助我们改进 Unity 文档的质量。虽然我们无法接受所有提交,但我们确实会阅读用户建议的每项更改内容,并在适用时进行更新。

关闭

提交失败

由于某些原因,你的建议更改无法提交。请在几分钟后<a>重试</a>。感谢你花时间帮助我们改进 Unity 文档的质量。

关闭

取消

声明

public static void RevertRemovedGameObject(GameObject gameObjectInInstance, GameObject assetGameObject, InteractionMode action);

参数

gameObjectInInstance 包含已移除 GameObject 的 Prefab 实例中的一项 GameObject。
assetGameObject Prefab 资源中与实例上已移除 GameObject 对应的 GameObject。
action 此操作的交互模式。

描述

将此已移除的 GameObject 重新添加到 Prefab 实例中。

撤消操作完成后,GameObject 将再次存在于 Prefab 实例中。

除非之前已将 GameObject 的组件和子级移除,否则它们也会再次存在。

请注意,在撤消之前已移除 GameObject 的层次结构中的已添加 GameObject 和已添加组件覆盖不会恢复。

其他资源:PrefabUtility.ApplyRemovedGameObjectPrefabUtility.GetRemovedGameObjects

using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;

// Creates new menu items under 'Examples' in the main menu. public class RevertRemovedGameObjectExample { [MenuItem("Examples/RevertRemovedGameObject Example 1")] static void CreatePrefabAndRevertChanges() { // 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");

//Setup hierarchy with root and one child GameObject rootGameObject = new GameObject("Root"); GameObject child = new GameObject("Child"); child.transform.parent = rootGameObject.transform;

//Create prefab based on the GameObject hierarchy we just created GameObject prefabAsset = PrefabUtility.SaveAsPrefabAssetAndConnect(rootGameObject, "Assets/Prefabs/" + rootGameObject.name + ".prefab", InteractionMode.AutomatedAction);

//Get the corresponding object matching the Child GameObject that was destroyed GameObject correspondingChildGameObject = prefabAsset.transform.GetChild(0).gameObject;

//Destroy child GameObject so we can apply the override to the Prefab Object.DestroyImmediate(child);

//Use the variables from above to revert the removed GameObject override in the instance and restore the child GameObject PrefabUtility.RevertRemovedGameObject(rootGameObject, correspondingChildGameObject, InteractionMode.AutomatedAction);

if (prefabAsset.transform.childCount == 1) Debug.Log("'Child' GameObject was removed and the override reverted successfully."); else Debug.Log("The override was not reverted successfully"); }

[MenuItem("Examples/RevertRemovedGameObject Example 2")] static void CreatePrefabAndApplyChangesWithGetRemovedGameObjects() { // 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");

//Setup hierarchy with root and one child GameObject rootGameObject = new GameObject("Root"); GameObject child = new GameObject("Child"); child.transform.parent = rootGameObject.transform;

//Create prefab based on the GameObject hierarchy we just created GameObject prefabAsset = PrefabUtility.SaveAsPrefabAssetAndConnect(rootGameObject, "Assets/Prefabs/" + rootGameObject.name + ".prefab", InteractionMode.AutomatedAction);

//Destroy child GameObject so we can apply the override to the Prefab Object.DestroyImmediate(child);

//Get the override and the information to apply the changes to the Prefab asset List<RemovedGameObject> removedGameObjects = PrefabUtility.GetRemovedGameObjects(rootGameObject); GameObject assetGameObject = removedGameObjects[0].assetGameObject; GameObject parentOfRemovedGameObjectInInstance = removedGameObjects[0].parentOfRemovedGameObjectInInstance;

//Use the variables from above to revert the removed GameObject override in the instance and restore the child GameObject PrefabUtility.RevertRemovedGameObject(parentOfRemovedGameObjectInInstance, assetGameObject, InteractionMode.AutomatedAction);

if (prefabAsset.transform.childCount == 1) Debug.Log("'Child' GameObject was removed and the override reverted successfully."); else Debug.Log("The override was not reverted successfully"); } }