(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]



EditorWindowのOnGUIでマウスの位置を取得したい時はwantsMouseMoveを有効にする【Unity】【エディタ拡張】


このエントリーをはてなブックマークに追加




この記事でのバージョン
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();
  }
  
}
f:id:kan_kikuchi:20200909074333j:plain


今回はそのEditorWindow上でのマウスの位置を取得する方法です。

f:id:kan_kikuchi:20200909081259g:plain



wantsMouseMove

まず、マウスの座標はEvent.current.mousePosition取得できます。

ただし、EditorWindowのGUIを更新するメソッドであるOnGUIは常に実行されているわけではないので、

マウスの座標を表示しようとしてもカーソルがウィンドウから外れた時などにしか更新されません。

//表示するGUIの設定
private void OnGUI() {
  EditorGUILayout.LabelField("マウスの位置", Event.current.mousePosition.ToString());
}
f:id:kan_kikuchi:20200909075751g:plain


なので、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();
  }
}
f:id:kan_kikuchi:20200909080508g:plain


余談ですが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();
  }
}
f:id:kan_kikuchi:20200909081259g:plain