Posted at

GameViewをフルスクリーンにする

More than 1 year has passed since last update.

UnityはPC上(UnityEditor)と各デバイス上でほぼ同じ画面が再現できるのと、Editorのほうがいろいろデバッグ機能を入れたりできるので、PCで動画収録したいなーということがあるかと思います。

となるとフルスクリーンにしたいところなんですが、GameViewにはそのものズバリな設定はなく、"Maximize On Play"もあくまで「Editorウィンドウ内で最大化」するもので、なんか違う…ということなります。

ということで、GameViewをフルスクリーンにするスクリプトを書いてみました。(Unity2017.1.1f1で確認)


FullScreenGameView.cs

using UnityEngine;

using UnityEditor;

// GameViewをフルスクリーンで表示するスクリプト(WindowsはF11、macOSはCommand+Shift+Fでトグル動作)
public class FullScreenGameView
{
const string menuPath = "Window/Game (Full Screen)";

#if UNITY_EDITOR_WIN
[MenuItem(menuPath + " _F11", false, 2001)]
#elif UNITY_EDITOR_OSX
[MenuItem(menuPath + " %#f", false, 2001)]
#endif
public static void Execute()
{
EditorWindow gameView = GetGameView();

if (Menu.GetChecked(menuPath) == false)
{
gameView.Close(); // ドッキング中にサイズを変えるとEditorのサイズも変わってしまうため一旦閉じる

float width = Screen.currentResolution.width;
float height = Screen.currentResolution.height;
float offset = 17.0f; // GameViewのコントロールバーの高さ(Unity2017.1の場合) ※タブや枠は計算に入れない

gameView = GetGameView();
gameView.minSize = new Vector2(width, height + offset);
gameView.position = new Rect(0, -offset, width, height + offset);

Menu.SetChecked(menuPath, true);
}
else
{
// 位置パラメータをデフォルトに戻してからClose
gameView.minSize = minSize;
gameView.position = position;
gameView.Close();

Menu.SetChecked(menuPath, false);
}
}

private static EditorWindow GetGameView()
{
// ウィンドウが存在しない場合は生成される
return EditorWindow.GetWindow(System.Type.GetType("UnityEditor.GameView,UnityEditor"));
}

// デフォルト位置パラメータ(元の位置には戻せないので、扱いやすい位置&サイズにしておく)
private static Vector2 minSize = new Vector2(100.0f, 100.0f);
private static Rect position = new Rect(0.0f, 0.0f, 640.0f, 480.0f);
}


UnityEditorのメニューから"Window/Game (Full Screen)"を選択するか、ショートカット(WindowsはF11、MacはCommand+Shift+F)でトグル動作するようになっています。

なお、Macの場合は事前にUnityEditorの左上の緑ボタンを押して全画面モードにしておくか、システム環境設定でメニューバーとDockを消しておく必要があります。本来のお作法としてはフルスクリーン化のショートカットはCommand+Control+Fなんですが、MenuItemではMacのControl(Ctrlではない)は指定できないようです。

やっていることとしては、GameViewを取得して最小サイズをフルスクリーンと同じサイズにして、コントロールバーの高さ分だけ上にずらして位置を設定しています。これは、最小サイズをフルスクリーンにしないと、Unityが気を利かせて画面内に収まるように小さく調整してしまい、タブやウィンドウ枠が見えてしまうためです。

キモとしましては、EditorWindow.GetWindow()にUnityEditor.GameViewクラスを指定するんですが、privateなのでそのままでは使えません。そこで、C#のSystem.Type.GetTypeを使ってUnityEditorのアセンブリから型を取得しています。

C#って何でもありなのね…。