Unity 6.3
0 онлайн 67 гостей 3 в системе
Вход

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