Unity ゲーム再生までの時間を短くするEnter Play Mode

Unity上で開発中のゲームを再生すると、始まるまでにメチャクチャ遅かったりしませんか?
そういう時に再生までの時間を短くする方法を紹介したいと思います。
注意点も書いておきます。
今回バージョンはUnity2012.2.1f1です。

Enter Play Mode

やり方はとても簡単です。
Edit > Project Settings > Editor > Enter Play Mode Optionsにチェックを入れれば終わりです。
Enter Play Mode OptionsはEditorの下の方にあります。

チェックありとなしでどれくらい速さが違うのか実験してみます。
まずはチェックなしです。

続いてチェックありです。

チェックありだとすぐにゲームが起動しキャラクターのアニメーションが始まりました。
これはどうして早くなるかというと、チェックの下にある「Reload Domain」「Reload Scene」が関係しています。

Reload Domain

Reload Domainはスクリプトの状態をリセットしてくれるものだそうです。
これをオフにすることで毎回リセットする処理を省いてゲームの再生が早くなるそうです。

Reload Scene

先程のReload Domainがスクリプトをリセットするのに対し、こちらは再生すると既存のゲームオブジェクトをすべて破棄して、ディスクからシーンを再ロードするそうです。
シーンが複雑になればなるほどこの時間が長くなります。
なのでオフにすることでゲームの再生までの時間が短縮されます。

注意点

staticな値がリセットされない

Reload Domainはスクリプトの初期化を行ってくれているわけですが、それをオフにすることでstaticな値がリセットされなくなります。
具体的に実験してみます。
スペースキーを押したらstaticのintの値が増えていくようにしてみます。

このようなコードがあった場合、Reload Domainがオフだったらどのような挙動になるでしょうか。
ゲーム再生 > スペースキー押す > ゲーム停止 > ゲーム再開 > スペースキー押す
この流れでログを確認してみます。

いかがでしょうか?停止して再開してもcountの値はリセットされていないのがわかるかと思います。
これを回避するには[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]を使うと良いです。
ゲームを再生するときに指定した関数を呼ぶことができます。

これでInitCountという関数が起動時に呼ばれcountを0にしています。
実験してみます。

無事にstaticな値がリセットされているのが確認できました。
注意点として起動時に指定する関数はstatic関数にしてください。

staticなイベントがリセットされない

Unityではstaticイベントが多数あります。
Reload Domainが有効な場合(通常)、ゲーム再生が終了したタイミングで自動的に破棄されますが、Reload Domainがオフだと破棄されません。
ゲーム再生終了時のイベントApplication.quittingに処理を登録して実験してみます。

これで実験してみます。

ゲーム再生停止を繰り返すたびにApplication.quittingに処理が追加されていき、ログに「ゲーム終わり」が一つずつ増えていくのがわかります。
これをリセットするには再生時にRuntimeInitializeOnLoadMethodで設定した関数を呼び出してイベントを破棄することで解消できます。
具体的にはこんな感じです。

start関数内で Application.quitting += _quitで処理を加えているのとは逆にApplication.quitting -= _quitで登録している処理を破棄しています。

実際に試し見てます。

このような感じで終了時のイベントの処理は破棄され、一度だけ実行されるのが確認できるかと思います。

このような注意点がありますが、Enter Play Modeを使うことでとても快適にUnityエディタ上でゲームを再生できます。

関連記事

最後までご覧頂いてありがとうございました。