# PickGameObject

> Pick game object closest to specified position.

## Definition

* **Type:** Method
* **Namespace:** [UnityEditor](/engine/6000.5/script-reference/unityeditor.md)
* **Assembly:** UnityEditor.CoreModule

## PickGameObject(Vector2, int)

Pick game object closest to specified position.

```csharp
public static GameObject PickGameObject(Vector2 position, out int materialIndex)
```

### Parameters

**** (\[Vector2]\(/engine/6000.5/script-reference/unityengine/vector2)): A position in screen coordinates. The top-left of the window is (0,0), and the bottom-right is (Screen.width, Screen.height).**** (\[int]\(https\://learn.microsoft.com/dotnet/api/system.int32)): Returns index into material array of the Renderer component that is closest to specified position.

### Returns

| Type                                                                    | Description                                          |
| ----------------------------------------------------------------------- | ---------------------------------------------------- |
| [GameObject](/engine/6000.5/script-reference/unityengine/gameobject.md) | The GameObject that is under the requested position. |

### Remarks

HandleUtility.PickGameObject must not be called during a repaint. In most cases it is appropriate to call during [EventType.MouseDown](/engine/6000.5/script-reference/unityengine/eventtype/mousedown.md) or [EventType.MouseUp](/engine/6000.5/script-reference/unityengine/eventtype/mouseup.md).

### Examples

```csharp
using UnityEditor;
using UnityEngine;

static class ShowHovered
{
    static GameObject m_LastHoveredObject, m_LastClickedObject;

    [InitializeOnLoadMethod]
    static void Init()
    {
        SceneView.duringSceneGui += OnSceneGUI;
    }

    static void OnSceneGUI(SceneView view)
    {
        var evt = Event.current;

        // Register a control so that if no other handle is engaged, we can use the event.
        var pickingControlId = GUIUtility.GetControlID(FocusType.Passive);
        HandleUtility.AddDefaultControl(pickingControlId);

        switch (evt.type)
        {
            case EventType.MouseMove:
            {
                var picked = HandleUtility.PickGameObject(evt.mousePosition, false);

                if (picked != m_LastHoveredObject)
                {
                    m_LastHoveredObject = picked;
                    SceneView.RepaintAll();
                }

                break;
            }

            case EventType.MouseDown:
            {
                // Make sure to check Tools.viewToolActive before consuming a mouse event, otherwise Scene navigation
                // controls will not work.
                if (!Tools.viewToolActive && HandleUtility.nearestControl == pickingControlId)
                {
                    GUIUtility.hotControl = pickingControlId;
                    evt.Use();
                }

                break;
            }

            case EventType.MouseUp:
            {
                // If the hotControl is not pickingControlId, that means another control has the rights to this event.
                if (GUIUtility.hotControl != pickingControlId)
                    return;

                var picked = HandleUtility.PickGameObject(evt.mousePosition, false);

                if (picked != m_LastClickedObject)
                {
                    m_LastClickedObject = picked;
                    SceneView.RepaintAll();
                }

                // Make sure to Use() and reset the hotControl the event if we are the active control ID.
                evt.Use();
                GUIUtility.hotControl = 0;
                break;
            }
        }

        Handles.BeginGUI();
        GUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.ExpandWidth(false));
        GUILayout.Label($"Last Hovered Object: {m_LastHoveredObject}");
        GUILayout.Label($"Last Clicked Object: {m_LastClickedObject}");
        GUILayout.EndVertical();
        Handles.EndGUI();
    }
}
```

## PickGameObject(Vector2, GameObject\[], int)

Pick game object closest to specified position.

```csharp
public static GameObject PickGameObject(Vector2 position, GameObject[] ignore, out int materialIndex)
```

### Parameters

**** (\[Vector2]\(/engine/6000.5/script-reference/unityengine/vector2)): A position in screen coordinates. The top-left of the window is (0,0), and the bottom-right is (Screen.width, Screen.height).**** (\[GameObject\[]]\(/engine/6000.5/script-reference/unityengine/gameobject)): An array of GameObjects that will not be considered when selecting the nearest GameObject.**** (\[int]\(https\://learn.microsoft.com/dotnet/api/system.int32)): Returns index into material array of the Renderer component that is closest to specified position.

### Returns

| Type                                                                    | Description                                          |
| ----------------------------------------------------------------------- | ---------------------------------------------------- |
| [GameObject](/engine/6000.5/script-reference/unityengine/gameobject.md) | The GameObject that is under the requested position. |

### Remarks

HandleUtility.PickGameObject must not be called during a repaint. In most cases it is appropriate to call during [EventType.MouseDown](/engine/6000.5/script-reference/unityengine/eventtype/mousedown.md) or [EventType.MouseUp](/engine/6000.5/script-reference/unityengine/eventtype/mouseup.md).

### Examples

```csharp
using UnityEditor;
using UnityEngine;

static class ShowHovered
{
    static GameObject m_LastHoveredObject, m_LastClickedObject;

    [InitializeOnLoadMethod]
    static void Init()
    {
        SceneView.duringSceneGui += OnSceneGUI;
    }

    static void OnSceneGUI(SceneView view)
    {
        var evt = Event.current;

        // Register a control so that if no other handle is engaged, we can use the event.
        var pickingControlId = GUIUtility.GetControlID(FocusType.Passive);
        HandleUtility.AddDefaultControl(pickingControlId);

        switch (evt.type)
        {
            case EventType.MouseMove:
            {
                var picked = HandleUtility.PickGameObject(evt.mousePosition, false);

                if (picked != m_LastHoveredObject)
                {
                    m_LastHoveredObject = picked;
                    SceneView.RepaintAll();
                }

                break;
            }

            case EventType.MouseDown:
            {
                // Make sure to check Tools.viewToolActive before consuming a mouse event, otherwise Scene navigation
                // controls will not work.
                if (!Tools.viewToolActive && HandleUtility.nearestControl == pickingControlId)
                {
                    GUIUtility.hotControl = pickingControlId;
                    evt.Use();
                }

                break;
            }

            case EventType.MouseUp:
            {
                // If the hotControl is not pickingControlId, that means another control has the rights to this event.
                if (GUIUtility.hotControl != pickingControlId)
                    return;

                var picked = HandleUtility.PickGameObject(evt.mousePosition, false);

                if (picked != m_LastClickedObject)
                {
                    m_LastClickedObject = picked;
                    SceneView.RepaintAll();
                }

                // Make sure to Use() and reset the hotControl the event if we are the active control ID.
                evt.Use();
                GUIUtility.hotControl = 0;
                break;
            }
        }

        Handles.BeginGUI();
        GUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.ExpandWidth(false));
        GUILayout.Label($"Last Hovered Object: {m_LastHoveredObject}");
        GUILayout.Label($"Last Clicked Object: {m_LastClickedObject}");
        GUILayout.EndVertical();
        Handles.EndGUI();
    }
}
```

## PickGameObject(Vector2, bool)

Pick game object closest to specified position.

```csharp
public static GameObject PickGameObject(Vector2 position, bool selectPrefabRoot)
```

### Parameters

**** (\[Vector2]\(/engine/6000.5/script-reference/unityengine/vector2)): A position in screen coordinates. The top-left of the window is (0,0), and the bottom-right is (Screen.width, Screen.height).**** (\[bool]\(https\://learn.microsoft.com/dotnet/api/system.boolean)): Select Prefab.

### Returns

| Type                                                                    | Description                                          |
| ----------------------------------------------------------------------- | ---------------------------------------------------- |
| [GameObject](/engine/6000.5/script-reference/unityengine/gameobject.md) | The GameObject that is under the requested position. |

### Remarks

HandleUtility.PickGameObject must not be called during a repaint. In most cases it is appropriate to call during [EventType.MouseDown](/engine/6000.5/script-reference/unityengine/eventtype/mousedown.md) or [EventType.MouseUp](/engine/6000.5/script-reference/unityengine/eventtype/mouseup.md).

### Examples

```csharp
using UnityEditor;
using UnityEngine;

static class ShowHovered
{
    static GameObject m_LastHoveredObject, m_LastClickedObject;

    [InitializeOnLoadMethod]
    static void Init()
    {
        SceneView.duringSceneGui += OnSceneGUI;
    }

    static void OnSceneGUI(SceneView view)
    {
        var evt = Event.current;

        // Register a control so that if no other handle is engaged, we can use the event.
        var pickingControlId = GUIUtility.GetControlID(FocusType.Passive);
        HandleUtility.AddDefaultControl(pickingControlId);

        switch (evt.type)
        {
            case EventType.MouseMove:
            {
                var picked = HandleUtility.PickGameObject(evt.mousePosition, false);

                if (picked != m_LastHoveredObject)
                {
                    m_LastHoveredObject = picked;
                    SceneView.RepaintAll();
                }

                break;
            }

            case EventType.MouseDown:
            {
                // Make sure to check Tools.viewToolActive before consuming a mouse event, otherwise Scene navigation
                // controls will not work.
                if (!Tools.viewToolActive && HandleUtility.nearestControl == pickingControlId)
                {
                    GUIUtility.hotControl = pickingControlId;
                    evt.Use();
                }

                break;
            }

            case EventType.MouseUp:
            {
                // If the hotControl is not pickingControlId, that means another control has the rights to this event.
                if (GUIUtility.hotControl != pickingControlId)
                    return;

                var picked = HandleUtility.PickGameObject(evt.mousePosition, false);

                if (picked != m_LastClickedObject)
                {
                    m_LastClickedObject = picked;
                    SceneView.RepaintAll();
                }

                // Make sure to Use() and reset the hotControl the event if we are the active control ID.
                evt.Use();
                GUIUtility.hotControl = 0;
                break;
            }
        }

        Handles.BeginGUI();
        GUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.ExpandWidth(false));
        GUILayout.Label($"Last Hovered Object: {m_LastHoveredObject}");
        GUILayout.Label($"Last Clicked Object: {m_LastClickedObject}");
        GUILayout.EndVertical();
        Handles.EndGUI();
    }
}
```

## PickGameObject(Vector2, bool, GameObject\[])

Pick game object closest to specified position.

```csharp
public static GameObject PickGameObject(Vector2 position, bool selectPrefabRoot, GameObject[] ignore)
```

### Parameters

**** (\[Vector2]\(/engine/6000.5/script-reference/unityengine/vector2)): A position in screen coordinates. The top-left of the window is (0,0), and the bottom-right is (Screen.width, Screen.height).**** (\[bool]\(https\://learn.microsoft.com/dotnet/api/system.boolean)): Select Prefab.**** (\[GameObject\[]]\(/engine/6000.5/script-reference/unityengine/gameobject)): An array of GameObjects that will not be considered when selecting the nearest GameObject.

### Returns

| Type                                                                    | Description                                          |
| ----------------------------------------------------------------------- | ---------------------------------------------------- |
| [GameObject](/engine/6000.5/script-reference/unityengine/gameobject.md) | The GameObject that is under the requested position. |

### Remarks

HandleUtility.PickGameObject must not be called during a repaint. In most cases it is appropriate to call during [EventType.MouseDown](/engine/6000.5/script-reference/unityengine/eventtype/mousedown.md) or [EventType.MouseUp](/engine/6000.5/script-reference/unityengine/eventtype/mouseup.md).

### Examples

```csharp
using UnityEditor;
using UnityEngine;

static class ShowHovered
{
    static GameObject m_LastHoveredObject, m_LastClickedObject;

    [InitializeOnLoadMethod]
    static void Init()
    {
        SceneView.duringSceneGui += OnSceneGUI;
    }

    static void OnSceneGUI(SceneView view)
    {
        var evt = Event.current;

        // Register a control so that if no other handle is engaged, we can use the event.
        var pickingControlId = GUIUtility.GetControlID(FocusType.Passive);
        HandleUtility.AddDefaultControl(pickingControlId);

        switch (evt.type)
        {
            case EventType.MouseMove:
            {
                var picked = HandleUtility.PickGameObject(evt.mousePosition, false);

                if (picked != m_LastHoveredObject)
                {
                    m_LastHoveredObject = picked;
                    SceneView.RepaintAll();
                }

                break;
            }

            case EventType.MouseDown:
            {
                // Make sure to check Tools.viewToolActive before consuming a mouse event, otherwise Scene navigation
                // controls will not work.
                if (!Tools.viewToolActive && HandleUtility.nearestControl == pickingControlId)
                {
                    GUIUtility.hotControl = pickingControlId;
                    evt.Use();
                }

                break;
            }

            case EventType.MouseUp:
            {
                // If the hotControl is not pickingControlId, that means another control has the rights to this event.
                if (GUIUtility.hotControl != pickingControlId)
                    return;

                var picked = HandleUtility.PickGameObject(evt.mousePosition, false);

                if (picked != m_LastClickedObject)
                {
                    m_LastClickedObject = picked;
                    SceneView.RepaintAll();
                }

                // Make sure to Use() and reset the hotControl the event if we are the active control ID.
                evt.Use();
                GUIUtility.hotControl = 0;
                break;
            }
        }

        Handles.BeginGUI();
        GUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.ExpandWidth(false));
        GUILayout.Label($"Last Hovered Object: {m_LastHoveredObject}");
        GUILayout.Label($"Last Clicked Object: {m_LastClickedObject}");
        GUILayout.EndVertical();
        Handles.EndGUI();
    }
}
```

## PickGameObject(Vector2, bool, GameObject\[], GameObject\[])

Pick game object closest to specified position.

```csharp
public static GameObject PickGameObject(Vector2 position, bool selectPrefabRoot, GameObject[] ignore, GameObject[] filter)
```

### Parameters

**** (\[Vector2]\(/engine/6000.5/script-reference/unityengine/vector2)): A position in screen coordinates. The top-left of the window is (0,0), and the bottom-right is (Screen.width, Screen.height).**** (\[bool]\(https\://learn.microsoft.com/dotnet/api/system.boolean)): Select Prefab.**** (\[GameObject\[]]\(/engine/6000.5/script-reference/unityengine/gameobject)): An array of GameObjects that will not be considered when selecting the nearest GameObject.**** (\[GameObject\[]]\(/engine/6000.5/script-reference/unityengine/gameobject)): An array of GameObjects to be exclusively considered for selection. If null, all GameObjects in open scenes are eligible for selection.

### Returns

| Type                                                                    | Description                                          |
| ----------------------------------------------------------------------- | ---------------------------------------------------- |
| [GameObject](/engine/6000.5/script-reference/unityengine/gameobject.md) | The GameObject that is under the requested position. |

### Remarks

HandleUtility.PickGameObject must not be called during a repaint. In most cases it is appropriate to call during [EventType.MouseDown](/engine/6000.5/script-reference/unityengine/eventtype/mousedown.md) or [EventType.MouseUp](/engine/6000.5/script-reference/unityengine/eventtype/mouseup.md).

### Examples

```csharp
using UnityEditor;
using UnityEngine;

static class ShowHovered
{
    static GameObject m_LastHoveredObject, m_LastClickedObject;

    [InitializeOnLoadMethod]
    static void Init()
    {
        SceneView.duringSceneGui += OnSceneGUI;
    }

    static void OnSceneGUI(SceneView view)
    {
        var evt = Event.current;

        // Register a control so that if no other handle is engaged, we can use the event.
        var pickingControlId = GUIUtility.GetControlID(FocusType.Passive);
        HandleUtility.AddDefaultControl(pickingControlId);

        switch (evt.type)
        {
            case EventType.MouseMove:
            {
                var picked = HandleUtility.PickGameObject(evt.mousePosition, false);

                if (picked != m_LastHoveredObject)
                {
                    m_LastHoveredObject = picked;
                    SceneView.RepaintAll();
                }

                break;
            }

            case EventType.MouseDown:
            {
                // Make sure to check Tools.viewToolActive before consuming a mouse event, otherwise Scene navigation
                // controls will not work.
                if (!Tools.viewToolActive && HandleUtility.nearestControl == pickingControlId)
                {
                    GUIUtility.hotControl = pickingControlId;
                    evt.Use();
                }

                break;
            }

            case EventType.MouseUp:
            {
                // If the hotControl is not pickingControlId, that means another control has the rights to this event.
                if (GUIUtility.hotControl != pickingControlId)
                    return;

                var picked = HandleUtility.PickGameObject(evt.mousePosition, false);

                if (picked != m_LastClickedObject)
                {
                    m_LastClickedObject = picked;
                    SceneView.RepaintAll();
                }

                // Make sure to Use() and reset the hotControl the event if we are the active control ID.
                evt.Use();
                GUIUtility.hotControl = 0;
                break;
            }
        }

        Handles.BeginGUI();
        GUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.ExpandWidth(false));
        GUILayout.Label($"Last Hovered Object: {m_LastHoveredObject}");
        GUILayout.Label($"Last Clicked Object: {m_LastClickedObject}");
        GUILayout.EndVertical();
        Handles.EndGUI();
    }
}
```

## PickGameObject(Vector2, GameObject\[], GameObject\[], int)

Pick game object closest to specified position.

```csharp
public static GameObject PickGameObject(Vector2 position, GameObject[] ignore, GameObject[] selection, out int materialIndex)
```

### Parameters

**** (\[Vector2]\(/engine/6000.5/script-reference/unityengine/vector2)): A position in screen coordinates. The top-left of the window is (0,0), and the bottom-right is (Screen.width, Screen.height).**** (\[GameObject\[]]\(/engine/6000.5/script-reference/unityengine/gameobject)): An array of GameObjects that will not be considered when selecting the nearest GameObject.**** (\[GameObject\[]]\(/engine/6000.5/script-reference/unityengine/gameobject)): An array of GameObjects to be exclusively considered for selection. If null, all GameObjects in open scenes are eligible for selection.**** (\[int]\(https\://learn.microsoft.com/dotnet/api/system.int32)): Returns index into material array of the Renderer component that is closest to specified position.

### Returns

| Type                                                                    | Description                                          |
| ----------------------------------------------------------------------- | ---------------------------------------------------- |
| [GameObject](/engine/6000.5/script-reference/unityengine/gameobject.md) | The GameObject that is under the requested position. |

### Remarks

HandleUtility.PickGameObject must not be called during a repaint. In most cases it is appropriate to call during [EventType.MouseDown](/engine/6000.5/script-reference/unityengine/eventtype/mousedown.md) or [EventType.MouseUp](/engine/6000.5/script-reference/unityengine/eventtype/mouseup.md).

### Examples

```csharp
using UnityEditor;
using UnityEngine;

static class ShowHovered
{
    static GameObject m_LastHoveredObject, m_LastClickedObject;

    [InitializeOnLoadMethod]
    static void Init()
    {
        SceneView.duringSceneGui += OnSceneGUI;
    }

    static void OnSceneGUI(SceneView view)
    {
        var evt = Event.current;

        // Register a control so that if no other handle is engaged, we can use the event.
        var pickingControlId = GUIUtility.GetControlID(FocusType.Passive);
        HandleUtility.AddDefaultControl(pickingControlId);

        switch (evt.type)
        {
            case EventType.MouseMove:
            {
                var picked = HandleUtility.PickGameObject(evt.mousePosition, false);

                if (picked != m_LastHoveredObject)
                {
                    m_LastHoveredObject = picked;
                    SceneView.RepaintAll();
                }

                break;
            }

            case EventType.MouseDown:
            {
                // Make sure to check Tools.viewToolActive before consuming a mouse event, otherwise Scene navigation
                // controls will not work.
                if (!Tools.viewToolActive && HandleUtility.nearestControl == pickingControlId)
                {
                    GUIUtility.hotControl = pickingControlId;
                    evt.Use();
                }

                break;
            }

            case EventType.MouseUp:
            {
                // If the hotControl is not pickingControlId, that means another control has the rights to this event.
                if (GUIUtility.hotControl != pickingControlId)
                    return;

                var picked = HandleUtility.PickGameObject(evt.mousePosition, false);

                if (picked != m_LastClickedObject)
                {
                    m_LastClickedObject = picked;
                    SceneView.RepaintAll();
                }

                // Make sure to Use() and reset the hotControl the event if we are the active control ID.
                evt.Use();
                GUIUtility.hotControl = 0;
                break;
            }
        }

        Handles.BeginGUI();
        GUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.ExpandWidth(false));
        GUILayout.Label($"Last Hovered Object: {m_LastHoveredObject}");
        GUILayout.Label($"Last Clicked Object: {m_LastClickedObject}");
        GUILayout.EndVertical();
        Handles.EndGUI();
    }
}
```

## PickGameObject(Vector2, bool, GameObject\[], GameObject\[], int)

Pick game object closest to specified position.

```csharp
public static GameObject PickGameObject(Vector2 position, bool selectPrefabRoot, GameObject[] ignore, GameObject[] filter, out int materialIndex)
```

### Parameters

**** (\[Vector2]\(/engine/6000.5/script-reference/unityengine/vector2)): A position in screen coordinates. The top-left of the window is (0,0), and the bottom-right is (Screen.width, Screen.height).**** (\[bool]\(https\://learn.microsoft.com/dotnet/api/system.boolean)): Select Prefab.**** (\[GameObject\[]]\(/engine/6000.5/script-reference/unityengine/gameobject)): An array of GameObjects that will not be considered when selecting the nearest GameObject.**** (\[GameObject\[]]\(/engine/6000.5/script-reference/unityengine/gameobject)): An array of GameObjects to be exclusively considered for selection. If null, all GameObjects in open scenes are eligible for selection.**** (\[int]\(https\://learn.microsoft.com/dotnet/api/system.int32)): Returns index into material array of the Renderer component that is closest to specified position.

### Returns

| Type                                                                    | Description                                          |
| ----------------------------------------------------------------------- | ---------------------------------------------------- |
| [GameObject](/engine/6000.5/script-reference/unityengine/gameobject.md) | The GameObject that is under the requested position. |

### Remarks

HandleUtility.PickGameObject must not be called during a repaint. In most cases it is appropriate to call during [EventType.MouseDown](/engine/6000.5/script-reference/unityengine/eventtype/mousedown.md) or [EventType.MouseUp](/engine/6000.5/script-reference/unityengine/eventtype/mouseup.md).

### Examples

```csharp
using UnityEditor;
using UnityEngine;

static class ShowHovered
{
    static GameObject m_LastHoveredObject, m_LastClickedObject;

    [InitializeOnLoadMethod]
    static void Init()
    {
        SceneView.duringSceneGui += OnSceneGUI;
    }

    static void OnSceneGUI(SceneView view)
    {
        var evt = Event.current;

        // Register a control so that if no other handle is engaged, we can use the event.
        var pickingControlId = GUIUtility.GetControlID(FocusType.Passive);
        HandleUtility.AddDefaultControl(pickingControlId);

        switch (evt.type)
        {
            case EventType.MouseMove:
            {
                var picked = HandleUtility.PickGameObject(evt.mousePosition, false);

                if (picked != m_LastHoveredObject)
                {
                    m_LastHoveredObject = picked;
                    SceneView.RepaintAll();
                }

                break;
            }

            case EventType.MouseDown:
            {
                // Make sure to check Tools.viewToolActive before consuming a mouse event, otherwise Scene navigation
                // controls will not work.
                if (!Tools.viewToolActive && HandleUtility.nearestControl == pickingControlId)
                {
                    GUIUtility.hotControl = pickingControlId;
                    evt.Use();
                }

                break;
            }

            case EventType.MouseUp:
            {
                // If the hotControl is not pickingControlId, that means another control has the rights to this event.
                if (GUIUtility.hotControl != pickingControlId)
                    return;

                var picked = HandleUtility.PickGameObject(evt.mousePosition, false);

                if (picked != m_LastClickedObject)
                {
                    m_LastClickedObject = picked;
                    SceneView.RepaintAll();
                }

                // Make sure to Use() and reset the hotControl the event if we are the active control ID.
                evt.Use();
                GUIUtility.hotControl = 0;
                break;
            }
        }

        Handles.BeginGUI();
        GUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.ExpandWidth(false));
        GUILayout.Label($"Last Hovered Object: {m_LastHoveredObject}");
        GUILayout.Label($"Last Clicked Object: {m_LastClickedObject}");
        GUILayout.EndVertical();
        Handles.EndGUI();
    }
}
```
