Объявление
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, который находится ближе всего к указанной позиции. |
position | Позиция в координатах GUI. Верхний левый угол окна равен (0,0), а нижний правый — (Screen.width, Screen.height).. |
ignore | Массив GameObjects, который не будет учитываться при выборе ближайшего GameObject. |
filter | Массив GameObjects, который будет рассматриваться исключительно для выбора. Если значение null, все игровые объекты в открытых сценах могут быть выбраны. |
selection | Массив GameObjects, который будет рассматриваться исключительно для выбора. Если значение null, все игровые объекты в открытых сценах могут быть выбраны. |
Возвращает
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();
}
}