Unityの-nographicsオプションの影響について

Unity Editorは、コマンドラインで実行することが可能です。

docs.unity3d.com

コマンドライン引数に与えるオプションによって、プロジェクトの作成、ライセンス認証(オンライン認証及びオフライン認証)、テストやビルド、C#スクリプトの実行まで、実に様々な動作が出来るようになっています。

その中に、グラフィック機能を持たない環境で動作する為の-nographicsオプションが存在します。

私はCIを触る事がよくあるのですが、CI用に用意されているマシンはグラフィック性能が抑えられている事がよくある為、このオプションをたまに使っているのですが、とある作業で、GPUが使えない環境での処理に失敗することがあった為、原因の調査を行いました。

結局のところ、そこで起きていた問題は-nographics起因の問題ではなかったのですが、せっかくなので纏めておきます。

-nographicsオプションについて

-nographics オプションは -batchmode と合わせて指定するオプションです。-batchmode指定が無い場合はエラーになります。

-batchmode -nographicsが指定されたとき、Unityはグラフィックデバイスの初期化を行いません。(-batchmodeだけ指定した場合は行います。)

右側のログが-nographicsオプションを付けた場合の挙動。

その結果、GUIが表示できなくなるのは勿論ですが、その他にもGPUに依存したいくつかの機能が利用できない状態になるようです。

blog.kyubuns.dev

www.nowsprinting.com

検証環境の用意

検証用にUnityプロジェクトを作成し、テストを作成してコマンドライン経由で-nographicsオプションを付けた場合に失敗するかどうかを確認します。

  • Unity : 2022.3.15f1

ビルド処理の検証

-nographicsが有効の場合、ログに以下の様な警告が出ます。

GfxDevice renderer is null. Unity cannot update the Ambient Probe and Reflection Probes that the SkyManager generates. Run the Editor without the -nographics argument or generate lighting for your scene.

ライティングアセットが含まれていないシーンをコマンドラインでビルドした場合、-nographics環境でビルドした方が暗くなってしまっています。

予めGPUが使えるPC上でライティングアセットを生成(ctrl+shift+L)しておけば、問題なくビルドが出来上がります。

その他の検証

試したこと 結果
プラットフォーム向けのテクスチャ圧縮 問題なく可能
画像・ビデオアセットの読み込み及びプロパティへのアクセス 問題なく可能
CPU側で完結したTextureへのSetPixel()及びGetPixel() 問題なく可能
GraphicsGLクラス 動作しないが、エラーも発生しない
ScreenCaptureクラス 動作しない(-batchmodeでウィンドウが存在しない時点で正常に動作しない)
Playmodeへの移行 問題なく可能

以上

通常のビルド処理であれば、-nographicsを付けたことによりエラーが生じることはなさそうです。ただし、ライティングアセットは事前に生成してリポジトリに含めておきましょう。また、もしビルドプロセスをフックしてグラフィック関連のAPIを使った処理を行う場合は、-nographics環境では正常に動作しないので注意してください。