エディタスクリプト 2つのGameObjectを選択した時の情報をシーンビューに表示

自分に需要があったので。

シーンに配置した2つのGameObjectがあり、
「あれ、この2つはどれくらい離れているのだっけ、、」ということがあり、
一瞬、差分を求める式を書いて実行してログ出して・・などとやって
事足りてはいるのだけど、
もうちょっとスマートにやりたくもあり、
エディタスクリプトでいつも使えるようにする方法。

シーンビューにUIを表示するのは
SceneView.onSceneGUIDelegate
にデリゲート追加して、処理を追加。

Hierarchyのオブジェクトが選択されたことを検知するためには
Selection.selectionChanged
にデリゲートを追加。
選択中のオブジェクトはSelection.gameObjectsで取得できます。

今回は距離を表示してみたかったので、
選択しているオブジェクトが2つの場合に、
距離を求めるように。(ついでにAABBの情報)
距離が有効な値の場合のみ、シーンビューに表示をするようにしています。

コードは以下のよう。

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

[InitializeOnLoad]
public class EditorDistance
{
	static float distance;

	static Bounds aabb;

	static EditorDistance()
	{
		 SceneView.onSceneGUIDelegate += (sceneView) =>
		{
			if( 0.0f > distance )
			{
				return;
			}

			Handles.BeginGUI();
			GUILayout.Window(1, new Rect(10, 26, 240, 47), OnGUI, GUIContent.none);
			Handles.EndGUI();
		};

		Selection.selectionChanged += () => 
		{
			if( 2 == Selection.gameObjects.Length )
			{
				var p0 = Selection.gameObjects[0].transform.position;
				var p1 = Selection.gameObjects[1].transform.position;
				distance = Vector3.Distance(p0, p1);
				aabb.center  = p0;
				aabb.extents = Vector3.zero;
				aabb.Encapsulate(p1);
			}
			else
			{
				distance = -1.0f;
			}	
		};
	}

	static void OnGUI(int id)
	{
		EditorGUILayout.LabelField("distance", distance.ToString());
		EditorGUILayout.LabelField("center",   aabb.center.ToString());
		EditorGUILayout.LabelField("extents",  aabb.extents.ToString());
	}
}

Hierarchyで、二つオブジェクトを選択すると下のように表示されます。

f:id:kurihara-n:20180318163703p:plain