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

PrefabUtility.MergePrefabInstance

Declaration

public static void MergePrefabInstance(GameObject instanceRoot);

Параметры

Параметр Описание
instanceRoot Корневая папка экземпляра Префаб для обновления.

Описание

Принуждает экземпляр Префаб к слиянию с изменениями из ассета Префаб.

Unity в большинстве случаев будет обрабатывать повторное слияние экземпляра Префаб при внесении изменений в Редакторе или с помощью скриптов. Однако, как показано в примере ниже, существуют некоторые редкие случаи, когда редактирование экземпляра Префаб из скрипта требует принудительного слияния экземпляра для получения немедленных обновлений.

Если вы не вызываете MergePrefabInstance в этих редких случаях, повторное слияние произойдет автоматически в конце текущего кадра, но если вам нужны изменения, немедленно отраженные в вашем сценарии, вы должны принудить слияние.

using UnityEngine;
using UnityEditor;

// This example shows how to use PrefabUtility.MergePrefabInstance to force update an instance after some changes

public class SuppressedComponentExample { public static void MergePrefabInstanceExample() { var instance = new GameObject("MyPrefabInstance"); const string path = "Assets/MyPrefab.prefab"; var prefab = PrefabUtility.SaveAsPrefabAssetAndConnect(instance, path, InteractionMode.AutomatedAction);

// Add Component to instance var component = instance.AddComponent<Rigidbody>();

// Add same type of component to the Prefab asset using (var scope = new PrefabUtility.EditPrefabContentsScope(path)) { scope.prefabContentsRoot.AddComponent<Rigidbody>(); }

// Because a Rigidbody already exists on the Prefab instance the one from the asset will be suppressed // we can get the suppressor and verify this var suppressor = instance.GetComponent<Rigidbody>(); Debug.Log($"Is component part of the Prefab instance: {PrefabUtility.IsPartOfPrefabInstance(suppressor)}");

// Destroy the suppressor to make the suppressed object return to glory Undo.DestroyObjectImmediate(suppressor); PrefabUtility.MergePrefabInstance(instance);

// Now we will get the former suppressed component and verify that it is actually part of the prefab var formerSuppressed = instance.GetComponent<Rigidbody>(); Debug.Log($"Is component part of the Prefab instance: {PrefabUtility.IsPartOfPrefabInstance(formerSuppressed)}"); } }