Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. We have updated the language to the Editor Terms based on feedback from our employees and community. Learn more..
    Dismiss Notice
  3. Dismiss Notice

DestroyImmediate in Prefab Mode

Discussion in 'Prefabs' started by Say-Chimp, Aug 22, 2019.

  1. Say-Chimp

    Say-Chimp

    Joined:
    Jul 16, 2019
    Posts:
    17
    I am having an editor code that have inconsistent behavior.

    Code (CSharp):
    1.  
    2.     private void ClearAllDecosInternal()
    3.     {
    4.         GetAllWalls();
    5.  
    6.         for (int i = 0; i < _wallsInLevel.Count; i++)
    7.         {
    8.             /*
    9.              * Inconsistent behaviour -_-
    10.             if (PrefabUtility.IsPartOfPrefabInstance(_wallsInLevel[i].transform.parent.gameObject))
    11.             {
    12.                 PrefabUtility.UnpackPrefabInstance(_wallsInLevel[i].transform.parent.gameObject, PrefabUnpackMode.OutermostRoot, InteractionMode.AutomatedAction);
    13.             }
    14.             */
    15.             _wallsInLevel[i].GetComponent<WallScript>().ClearAllDecorations();
    16.         }
    17.  
    18.         MarkChangesToPrefab();
    19.     }
    20.  
    Code (CSharp):
    1.  
    2.     public void ClearAllDecorations()
    3.     {
    4.         Transform[] childs = gameObject.GetComponentsInChildren<Transform>();
    5.         List<GameObject> decos = new List<GameObject>();
    6.         for (int i = 0; i < childs.Length; i++)
    7.         {
    8.             if (childs[i].CompareTag("WallDeco"))
    9.             {
    10.                 decos.Add(childs[i].gameObject);
    11.             }
    12.         }
    13.  
    14.         for (int i = 0; i < decos.Count; i++)
    15.         {
    16.             if (decos != null)
    17.             {
    18.                 DestroyImmediate(decos[i].gameObject);
    19.             }
    20.         }
    21.     }
    22.  
    It works for some of prefabs and breaks for some prefabs.
    The error thrown by editor is
    InvalidOperationException: Destroying a GameObject inside a Prefab instance is not allowed.
    .

    To answer a few questions, the walls are prefabs. The Decorations are prefab. My issue is why it works on some prefabs, and not on another. I dont want to unpack the prefab because, i want to be able to use the nested prefab feature.
     
  2. Say-Chimp

    Say-Chimp

    Joined:
    Jul 16, 2019
    Posts:
    17
    I used a workaround that worked for me.
    PrefabUtility.RevertPrefabInstance