トップ > 【Unity】エディター拡張方法をまとめます! > 【Unity】EditorWindow上でGUI.Window関数を利用してウィンドウを表示するエディター拡張方法について紹介します!
更新日 2022/9/3

【Unity】EditorWindow上でGUI.Window関数を利用してウィンドウを表示するエディター拡張方法について紹介します!

EditorWindow上でGUI.Window関数を利用してウィンドウを表示する方法をまとめます。

簡潔なウィンドウのサンプル

EditorWindowにWindowを表示する簡潔なサンプルです。

GUI_Window

TestWindow.cs

using UnityEditor;
using UnityEngine;

public class TestWindow : EditorWindow
{
[MenuItem("Window/TestWindow")]
public static void Test()
{
GetWindow<TestWindow>();
}

void OnGUI()
{
BeginWindows();
GUI.Window(0, new Rect(100, 100, 100, 100), WindowFunc, "タイトル");
EndWindows();
}

void WindowFunc(int id)
{
}
}

MenuItem属性で指定したメニューのWindow/TestWindowでウィンドウを開きます。

GUI_Window_Menu

移動可能なウィンドウ

マウスによる移動を可能にしたウィンドウを実装します。

GUI_Window_Move

TestWindow2.cs

using UnityEditor;
using UnityEngine;

public class TestWindow2 : EditorWindow
{
[MenuItem("Window/TestWindow")]
public static void Test()
{
GetWindow<TestWindow>();
}

Rect windowPosition = new Rect(100, 100, 100, 100);

void OnGUI()
{
BeginWindows();
windowPosition = GUI.Window(0, windowPosition, WindowFunc, "タイトル");
EndWindows();
}

void WindowFunc(int id)
{
GUI.DragWindow();
}
}

閉じるボタンを加えたウィンドウ

閉じるボタンをウィンドウの右上に表示し、ボタンが押されたらウィンドウを非表示にします。

GUI_Window_Close

TestWindow3.cs

using UnityEditor;
using UnityEngine;

public class TestWindow3 : EditorWindow
{
[MenuItem("Window/TestWindow")]
public static void Test()
{
GetWindow<TestWindow>();
}

Rect windowPosition = new Rect(100, 100, 100, 100);
bool show = true;

void OnGUI()
{
BeginWindows();
if(show) windowPosition = GUI.Window(0, windowPosition, WindowFunc, "タイトル");
EndWindows();
}

void WindowFunc(int id)
{
if(GUI.Button(new Rect(windowPosition.width-18, 2, 16, 16), "x"))
{
show = false;
}
GUI.DragWindow();
}
}

サイズ変更可能なウィンドウ

ウィンドウサイズを変更できるようにします。
複雑な処理になるため今回は右端でのみ変更できるように実装します。

GUI_Window_Resize

TestWindow4.cs

using UnityEditor;
using UnityEngine;

public class TestWindow : EditorWindow
{
[MenuItem("Window/TestWindow")]
public static void Test()
{
var window = GetWindow<TestWindow>();
window.wantsMouseMove = true;
window.Show();
}

Rect windowPosition = new Rect(100, 100, 100, 100);

int resizeId = -1;
float resizeX = 0;
float resizeWidth = 0;

MouseCursor cursor = MouseCursor.Arrow;

void OnGUI()
{
BeginWindows();
windowPosition = GUI.Window(0, windowPosition, WindowFunc, "タイトル");
EndWindows();

Rect rightEdge = new Rect(windowPosition.x + windowPosition.width, windowPosition.y, 2, windowPosition.height);

switch (Event.current.type)
{
case EventType.MouseMove:
cursor = rightEdge.Contains(Event.current.mousePosition) ? MouseCursor.ResizeHorizontal : MouseCursor.Arrow;
Event.current.Use();
break;
case EventType.MouseDown:
if (rightEdge.Contains(Event.current.mousePosition))
{
resizeId = 0;
resizeX = Event.current.mousePosition.x;
resizeWidth = windowPosition.width;
Event.current.Use();
}
break;
case EventType.MouseDrag:
if (0 <= resizeId)
{
windowPosition.width = resizeWidth + Event.current.mousePosition.x - resizeX;
Event.current.Use();
}
break;
case EventType.MouseUp:
if (0 <= resizeId)
{
resizeId = -1;
cursor = MouseCursor.Arrow;
Event.current.Use();
}
break;
}

EditorGUIUtility.AddCursorRect(new Rect(0, 0, position.width, position.height), cursor);
Repaint();
}

void WindowFunc(int id)
{
GUI.DragWindow();
}
}

ウィンドウの右端2ピクセルをリサイズ可能な範囲にしてカーソルを変更しています。
EditorGUIUtility.AddCursorRectでカーソル変更後は、
Repaint関数を呼ばないとカーソルが直ぐに再描画されませんでした。

続く・・・。


関連ページ


Copyright ©2022 - 2024 うにぉらぼ