シーンにゲームオブジェクトが多くなると、頻繁に選択するオブジェクトを探すのが面倒です。そこで、シーンの特定のオブジェクトを選択するためのボタンを表示してみました。
エディターウィンドウを表示する
エディターウィンドウを作るには、まず「Editor」という名前のフォルダにC#スクリプトを作り、そのクラスにEditorWindowクラスを継承させます。
using UnityEngine;
using UnityEditor;
public class ObjectSelector : EditorWindow
{
GameObject obj;
[MenuItem("Examples/ObjectSelector")]
static void Init()
{
// ウィンドウを表示する
GetWindow(typeof(ObjectSelector));
}
void OnGUI()
{
// アタッチされたゲームオブジェクト
obj = (GameObject)EditorGUILayout.ObjectField("GameObject", obj, typeof(GameObject), true);
// アタッチされているとき
if (obj != null)
{
// ボタンを表示
if (GUILayout.Button("Select"))
{
// クリックしたときの処理
// アタッチされたオブジェクトを選択する
Selection.activeGameObject = obj;
}
}
// メインカメラを選択するボタン
if (GUILayout.Button("SelectMainCamera"))
{
Selection.activeGameObject = Camera.main.gameObject;
}
}
}
ウィンドウの表示には、GetWindowメソッドを使います。引数にはEditorWindowを継承した型を入れます。すでに画面上に同じ型のウィンドウがある場合はそのウィンドウを返します。
そして、この処理を行うメソッドにMenuItem属性をつけることで、メニューバーからメソッドを呼べるようにします。
これで、メニューを選択するとウィンドウが開きます。
このウィンドウは他のウィンドウと同様にドック可能です。
シーンのゲームオブジェクトを取得する
ウィンドウでの処理はOnGUIメソッドに書きます。ここでは、EditorGUILayout.ObjectFieldメソッドでオブジェクトをアタッチできるようにしています。
引数のallowSceneObjectsにtrueを渡すことで、シーンのゲームオブジェクトをドラッグアンドドロップできるようになります。
obj = (GameObject)EditorGUILayout.ObjectField("GameObject", obj, typeof(GameObject), true);
ボタンを表示
GUILayout.Buttonメソッドを呼ぶとボタンが表示されます。ボタンが押されるとtrueが変えるので、if文を使ってボタンが押されたときの処理を書いています。
// アタッチされているとき
if (obj != null)
{
// ボタンを表示
if (GUILayout.Button("Select"))
{
// クリックしたときの処理
// アタッチされたオブジェクトを選択する
Selection.activeGameObject = obj;
}
}
// メインカメラを選択するボタン
if (GUILayout.Button("SelectMainCamera"))
{
Selection.activeGameObject = Camera.main.gameObject;
}
選択中のゲームオブジェクトは、Selectionクラスの静的変数のactiveGameObjectに入っています。これにゲームオブジェクトを渡すとそのオブジェクトを選択した状態になります。
これで、ボタンを押してシーンのオブジェクトを選択できるようになりました。