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 :

  1. One object field, that gets a reference to a prefab (blueprint - not an instance).
  2. 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 : Unity - Scripting API: PrefabUtility.GetPrefabParent
  • Code 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.

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;
}