この記事でのバージョン
Unity 2019.4.9f1
はじめに
Unityのエディタ拡張には簡単にウィンドウを作る事が出来るEditorWindowがあります。
using UnityEditor; /// <summary> /// EditorWindowのサンプル /// </summary> public class EditorWindowSample : EditorWindow { //================================================================================= //初期化 //================================================================================= //ウィンドウを開く [MenuItem("Tools/Editor Window Sample")] private static void OpenWindow() { GetWindow<EditorWindowSample>().Show(); } }
今回はそのEditorWindow上でのマウスの位置を取得する方法です。
wantsMouseMove
まず、マウスの座標はEvent.current.mousePosition取得できます。
ただし、EditorWindowのGUIを更新するメソッドであるOnGUIは常に実行されているわけではないので、
マウスの座標を表示しようとしてもカーソルがウィンドウから外れた時などにしか更新されません。
//表示するGUIの設定 private void OnGUI() { EditorGUILayout.LabelField("マウスの位置", Event.current.mousePosition.ToString()); }
なので、OnGUIでマウスの位置を取得したい時はwantsMouseMoveを有効にします。
True に設定した場合、ウィンドウの上でマウスが動くたびにウィンドウは OnGUI 呼び出しを受信します。
注意: この関数は Repaint() を自動的に発生しません。
なおドキュメントにある通り、Repaintは実行されないので別途実行する必要があります。
//表示するGUIの設定 private void OnGUI() { EditorGUILayout.LabelField("マウスの位置", Event.current.mousePosition.ToString()); //wantsMouseMoveをトグルで切り替えられるように wantsMouseMove = EditorGUILayout.Toggle("wantsMouseMove", wantsMouseMove); //マウスが動いたら再描画(wantsMouseMoveが有効でないとOnGUI自体が呼ばれないの無意味) if (Event.current.type == EventType.MouseMove) { Repaint(); } }
余談ですがEditorWindowはposition.sizeでウィンドウのサイズを取得出来ます。
ついでにウィンドウのサイズも表示してみると以下のような感じに。
ちなみに、左上の座標が0, 0になります
//表示するGUIの設定 private void OnGUI() { EditorGUILayout.LabelField($"ウィンドウのサイズ", position.size.ToString()); EditorGUILayout.LabelField("マウスの位置", Event.current.mousePosition.ToString()); //wantsMouseMoveをトグルで切り替えられるように wantsMouseMove = EditorGUILayout.Toggle("wantsMouseMove", wantsMouseMove); //マウスが動いたら再描画(wantsMouseMoveが有効でないとOnGUI自体が呼ばれないの無意味) if (Event.current.type == EventType.MouseMove) { Repaint(); } }