やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

PlayModeWindowでGameビューの解像度を指定する

PlayModeWindowは、Unity 2022.2で追加されたクラスです。 従来、UnityエディターのGameビューをスクリプトから操作するにはリフレクションによる非公開APIの使用が必要でした。 Unity 2022.2からは、PlayModeWindowクラスの静的メソッドで操作できます。

PlayModeWindowクラスは、PlayModeViewクラス*1を制御する機能を持ち、GameビューとSimulatorビューを切り替えたり、解像度を変更するAPIが提供されています。

docs.unity3d.com

Gameビューへの切り替え

解像度の指定は、SimulatorビューではなくGameビュー表示である必要があります。 次のように切り替えます。

PlayModeWindow.SetViewType(PlayModeWindow.PlayModeViewTypes.GameView);

引数には、GameViewもしくはSimulatorViewを指定できます。

解像度の指定

解像度はSetCustomRenderingResolutionメソッドで変更できます。 Full HD(1920×1080)に変更する場合、次のように指定します。

PlayModeWindow.SetCustomRenderingResolution(1920, 1080, "Full HD");

テスト実行時の解像度を固定する方法1(ICallbacks)

たとえば、すべてのテストで解像度をFull HD(1920×1080)に固定したければ、ICallbacksを使用して次のように実装します。

public class OpenGameViewAtRunStarted : ICallbacks
{
  [InitializeOnLoadMethod]
  private static void SetupTestCallbacks()
  {
    var api = ScriptableObject.CreateInstance<TestRunnerApi>();
    api.RegisterCallbacks(new OpenGameViewAtRunStarted());
  }

  public void RunStarted(ITestAdaptor testsToRun)
  {
    PlayModeWindow.SetViewType(PlayModeWindow.PlayModeViewTypes.GameView);
    PlayModeWindow.SetCustomRenderingResolution(1920, 1080, "Full HD");
  }

  // snip
}

テスト実行時の解像度を固定する方法2(GameViewResolution属性)

テスト実行時に解像度指定する場合は、Test Helperパッケージに含まれるGameViewResolution属性が便利です*2

この属性はテストアセンブリ・クラス・メソッドいずれかに付けることができ、どこにつけても各テストメソッドの実行前(SetUpの前)に処理されます。

すべてのテストで同じ解像度でよければ、次のようにテストアセンブリに付与します*3

[assembly: GameViewResolution(1920, 1080, "Full HD")]

テストごとに個別に指定したいときには、次のようにテストクラスやメソッドに付与できます。

[TestFixture]
public class MyTestClass
{
  [UnityTest]
  [GameViewResolution(1920, 1080, "Full HD")]
  public IEnumerator MyTestMethod()
  {
    // test
  }
}

Test Helperパッケージは、Unity 2019.4以降で利用できます。 Unity 2022.2未満のときはリフレクションによる非公開APIを使用していますので、自分で実装するときの参考にもなるはずです。

github.com

補足

本記事は、拙著『Unity Test Framework完全攻略ガイド 統合テスト編』の第5章「ビジュアルリグレッションテスト」からの抜粋です。

www.nowsprinting.com

テストの基本から知りたい! という方は、『Unity Test Framework完全攻略ガイド 第2版』からお読みください!

www.nowsprinting.com

*1:GameViewクラスおよび、旧Device SimulatorパッケージのSimulatorWindowクラスの親クラス。Device SimulatorがUnity 2021.1からビルトインされて変更されましたが、概念としては変わらず2つのビューの抽象

*2:この属性は、Unity 2022.2未満ではリフレクションで非公開APIを使用して動作します

*3:Play Modeテストアセンブリが複数あるプロジェクトであれば、アセンブリごとに指定が必要です