- Home /
Why is PrefabUtility.IsPartOfAnyPrefab(gameObject) returning false even though the object is a prefab?
Like the question implies, I have a script that runs in the editor and I am trying to test if an object is a prefab; however, PrefabUtility.IsPartOfAnyPrefab(gameObject) returns false. I have tried other commands such as PrefabUtility.IsPartOfModelPrefab(gameObject), PrefabUtility.IsPartOfPrefabAsset(gameObject), and PrefabUtility.IsPartOfRegularPrefab(gameObject) yet they all return false. What could be causing this to fail?
Thanks in advance!
Answer by Bunny83 · May 21, 2019 at 12:55 AM
even though the object is a prefab?
Are you actually sure about that? Keep in mind that when you use Instantiate on a prefab the created clone is not a "prefab" nor a "prefab instance". If you want to create an instance of a prefab inside the editor you have to use PrefabUtility.InstantiatePrefab. We don't know enough about what that "object" is, where it's located, etc ...
Answer by winxalex · Nov 03, 2019 at 01:13 PM
@Nate2033 The object we don't know much about I called PrefabContent. When you open "Open" prefab, that's Prefab content, and is same type as any pure GameObject, so PrefabUtility.IsPartOfAnyPrefab(gameObject) returns false. To find out Prefab asset from PrefabContent you should use PrefabUtility.GetCorrespondingObjectFromOriginalSource
The code will help you test your GameObjects in u2019 similar to previous APIs #if UNITY_2019_1_OR_NEWER public enum PrefabType { None = 0, Prefab = 1, ModelPrefab = 2, PrefabInstance = 3, ModelPrefabInstance = 4, MissingPrefabInstance = 5, DisconnectedPrefabInstance = 6, DisconnectedModelPrefabInstance = 7, PrefabContent = 8, Variant = 9 } #endif public static PrefabType GetPrefabType(UnityEngine.Object target) { #if UNITY_2019_1_OR_NEWER if (target is GameObject && PrefabStageUtility.GetPrefabStage(target as GameObject) !=null) return PrefabType.PrefabContent; if (!PrefabUtility.IsPartOfAnyPrefab(target)) { return PrefabType.None; } else { switch (PrefabUtility.GetPrefabInstanceStatus(target)) { case PrefabInstanceStatus.NotAPrefab: switch (PrefabUtility.GetPrefabAssetType(target)) { case PrefabAssetType.Regular: return PrefabType.Prefab; case PrefabAssetType.Variant: return PrefabType.Variant; case PrefabAssetType.Model: return PrefabType.ModelPrefab; } break; case PrefabInstanceStatus.Connected: if (PrefabUtility.IsPartOfModelPrefab(target)) return PrefabType.ModelPrefabInstance; else return PrefabType.PrefabInstance; case PrefabInstanceStatus.Disconnected: if (PrefabUtility.IsPartOfModelPrefab(target)) return PrefabType.DisconnectedModelPrefabInstance; else return PrefabType.DisconnectedPrefabInstance; case PrefabInstanceStatus.MissingAsset: return PrefabType.MissingPrefabInstance; } return PrefabType.None; } #else return PrefabUtility.GetPrefabType(target); #endif }
Your answer
Follow this Question
Related Questions
PrefabUtility - Check if Changes have been made to Prefab? 3 Answers
How do I change the name of the prefab in the prefab folder with code? 0 Answers
Can I create a child gameobject on a prefab with an editor script 2 Answers
Editor Script: Linking GameObjects to public script variables resets when playing. 1 Answer
How to execute a script each time I add a certain prefab to the scene? 2 Answers