gameObjectInInstance | 包含已移除 GameObject 的 Prefab 实例中的一项 GameObject。 |
assetGameObject | Prefab 资源中与实例上已移除 GameObject 对应的 GameObject。 |
action | 此操作的交互模式。 |
将此已移除的 GameObject 重新添加到 Prefab 实例中。
撤消操作完成后,GameObject 将再次存在于 Prefab 实例中。
除非之前已将 GameObject 的组件和子级移除,否则它们也会再次存在。
请注意,在撤消之前已移除 GameObject 的层次结构中的已添加 GameObject 和已添加组件覆盖不会恢复。
其他资源:PrefabUtility.ApplyRemovedGameObject、PrefabUtility.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"); } }