コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】HandleUtility.GetOverlappingObjects で Scene ビューの指定した位置にあるすべてのオブジェクトを取得できる

使用例

using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

[InitializeOnLoad]
internal static class Example
{
    static Example()
    {
        // HandleUtility.GetOverlappingObjects は
        // Scene の GUI イベント中じゃないと使えないらしい
        SceneView.duringSceneGui -= OnSceneGUI;
        SceneView.duringSceneGui += OnSceneGUI;
    }

    private static void OnSceneGUI( SceneView sceneView )
    {
        var e = Event.current;

        // マウスの左クリック以外は無視
        if ( e.type != EventType.MouseDown ) return;
        if ( e.button != 0 ) return;

        // Scene ビューのデフォルトの左クリックのイベントを無効化
        e.Use();

        // マウスの位置にあるすべてのオブジェクトを取得
        var outObjectList = new List<Object>();
        
        HandleUtility.GetOverlappingObjects
        (
            position: e.mousePosition,
            outObjectList: outObjectList
        );

        // 選択オブジェクトを変更
        Selection.objects = outObjectList.ToArray();

        // ログに出力
        foreach ( var outObject in outObjectList )
        {
            Debug.Log( outObject.name, outObject );
        }
    }
}

参考サイト様