HandleUtility.PickGameObject
Declaration
public static GameObject PickGameObject(Vector2 position, out int materialIndex);public static GameObject PickGameObject(Vector2 position, GameObject[] ignore, out int materialIndex);public static GameObject PickGameObject(Vector2 position, GameObject[] ignore, GameObject[] selection, out int materialIndex);public static GameObject PickGameObject(Vector2 position, bool selectPrefabRoot);public static GameObject PickGameObject(Vector2 position, bool selectPrefabRoot, GameObject[] ignore);public static GameObject PickGameObject(Vector2 position, bool selectPrefabRoot, GameObject[] ignore, GameObject[] filter);public static GameObject PickGameObject(Vector2 position, bool selectPrefabRoot, GameObject[] ignore, GameObject[] filter, out int materialIndex);Параметры
| Параметр | Описание |
|---|---|
| selectPrefabRoot | Выберите Префаб. |
| materialIndex | Возвращает индекс в материальный массив компонента Renderer, который ближе всего к указанной позиции. |
| должность | Позиция в координатах экрана. Верхний левый угол окна — (0,0), а нижний правый — (Screen.width, Screen.height). |
| игнорировать | Массив GameObjects, который не будет учитываться при выборе ближайшего GameObject. |
| фильтр | Массив GameObjects, который будет рассматриваться исключительно для выбора. Если null, то все GameObjects в открытых сценах будут иметь право на выбор. |
| выбор | Массив GameObjects, который будет рассматриваться исключительно для выбора. Если null, то все GameObjects в открытых сценах будут иметь право на выбор. |
Возвращаемое значение
GameObject GameObject, который находится под запрашиваемой позицией.
Описание
Выберите GameObject, ближайший к указанной позиции.
HandleUtility.PickGameObject не должен вызываться во время перерисовки. В большинстве случаев целесообразно вызывать во время EventType.MouseDown или EventType.MouseUp.
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(); } }