- Home /
EditoryWindow : How to check if a GameObject in hierarchy is an instance of a prefab?
I am trying to figure out code that will determine if one gameObject is an instance of a given prefab.
This is done in an editorWindow with 2 user inputs :
One object field, that gets a reference to a prefab (blueprint - not an instance).
Another object field, that gets a reference to a GameObject in the hierarchy.
What I'd like the editorWindow to do is give a yes/no answer on whether the GameObject is an instance of the prefab.
Code I have is currently something like this - most of it is just basic editorWindow stuff. Just needs the implementation details in method ''IsGameObjectPrefabInstance"
public class PrefabCheckWindow : EditorWindow
{
GameObject prefab;
GameObject selectedObject;
[MenuItem("MyCustomEditors/PrefabCheck")]
public static void CreateWindow()
{
var window = EditorWindow.GetWindow<LearningEditorWindow>();
window.Show();
}
public void OnGUI()
{
// the object in 'this.prefab' is a prefab blueprint
this.prefab = EditorGUILayout.ObjectField("Prefab Blueprint", this.prefab, typeof(GameObject), false) as GameObject;
// the object here is an object in hierarcy.
this.selectedObject = EditorGUILayout.ObjectField("Selected GameObject", this.selectedObject, typeof(GameObject), true) as GameObject;
// Simple echo answer to tell if its a prefab.
bool isInstance = this.IsGameObjectPrefabInstance(this.prefab, this.selectedObject);
EditorGUILayout.LabelField(isInstance.ToString());
}
private bool IsGameObjectPrefabInstance(GameObject prefabSource, GameObject objectInstance)
{
// method should return true if objectInstance is a prefab instance of prefabSource, false otherwise
}
}
This is somewhat similar to already existing functionality in the Unity environment - I can already right click on a prefab, go to 'Find References in Scene' and get the gameObjects that are instances of the prefab. I'm just trying to script the functionality.
Some approaches that are related, but do not work :
Any code that uses
PrefabUtility.GetPrefabParent.
This method (and many others?) has been deprecated : https://docs.unity3d.com/ScriptReference/PrefabUtility.GetPrefabParent.htmlCode with some equivalent of
scene.rootCount == 0
. This can check if a reference to a gameobject is in the hierarchy, and therefore disclude it from being a prefab. But it does not establish an instance-of-prefab relation.
Answer by Hupman · Nov 16, 2020 at 11:45 PM
One working option - use PrefabUtility.GetCorrespondingObjectFromOriginalSource
.
private bool IsGameObjectPrefabInstance(GameObject prefabSource, GameObject objectInstance)
{
GameObject original = PrefabUtility.GetCorrespondingObjectFromOriginalSource(objectInstance);
if (original == null)
{
return false;
}
return original == prefabSource;
}
Your answer
![](https://koobas.hobune.stream/wayback/20220613015924im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Destroy Cloned Object on Collision 1 Answer
Instantiating a new clone of a prefab whilst setting the previous clone as inactive 0 Answers
Spawned prefabs not keeping their Look At funtion 2 Answers
Script stopped working, prefabs behaving strangely 0 Answers
Scripts/buttons getting old (prefab?) values of variables 1 Answer