この記事でのバージョン
Unity 2019.3.b10
はじめに
TwitterでEnter Play Mode Settingsなる明らかに便利そうなUnityの新機能を知ったので、
今回はそれを試してみた感じの記事です!
Enter Play Mode Settings、やっぱ楽だなぁ。ゲーム再生ボタン押してからゲームが始まるのが超早い pic.twitter.com/eI2kF8Fgd4
— 椿 (@tsubaki_t1) 2019年11月11日
なお、記事中の画像は以下のアセットを使っております。
Corgi Engine - 2D + 2.5D Platformer - Asset Store |
Enter Play Mode Settings
Enter Play Mode SettingsとはUnity 2019.3(現状ベータ版)で追加された機能で、
ざっくり言うとUnityエディタを再生する前の待ち時間を大幅に減らすことが出来るものです。
Based on our test results, this can save you up to 50-90% of waiting time, depending on your project.
(Google翻訳 : テスト結果に基づいて、プロジェクトに応じて待機時間を最大50〜90%節約できます。)
ただし、まだExperimental(実験的)な機能なので、今後大幅な仕様変更があったり、
最悪、機能自体が無くなる可能性もある点には注意が必要です。
使い方と比較
使い方は簡単、Edit/Project Settingsの
EditorにあるEnter Play Mode Optionsを有効にするだけ。
実際に待ち時間を比較して見るよ以下のような感じ。
なお、同じシーンを同時に再生したもので、左が機能を無効、右が機能を有効にしたものです。
再生開始の早さは一目瞭然で、
具体的な数字で言うと、なんと待機時間を3.2秒(約85%)も削減出来ています。
注意点
もの凄い簡単で便利な機能ではありますが、知らないとハマる注意点もあります。
staticな値がリセットされない
Enter Play Mode Settingsを有効にした状態だと、再生を終了してもstaticな値が初期値に戻りません。
例えば、スペースを押した回数をstaticで管理してみると
再生し直しても回数がリセットされていないのが分かります。
//スペースを押した回数 private static int _spaceCount = 0; private void Update(){ //スペースを押したら回数を増やしログを表示 if (Input.GetKeyDown(KeyCode.Space)){ _spaceCount++; Debug.Log($"_spaceCount : {_spaceCount}"); } }
この問題はRuntimeInitializeOnLoadMethodを使い、
再生時にstaticな値を初期値に戻す事で解決出来ます。
//スペースを押した回数 private static int _spaceCount = 0; //再生開始時に初期化 [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] private static void Init(){ //回数を初期値に戻す _spaceCount = 0; } private void Update(){ //スペースを押したら回数を増やしログを表示 if (Input.GetKeyDown(KeyCode.Space)){ _spaceCount++; Debug.Log($"_spaceCount : {_spaceCount}"); } }
staticなイベントへの登録が自動破棄されない
Unityにはstaticなイベントが多数用意されています。
通常時だとこのイベントに処理を登録したとしても、エディタ再生終了時に自動で破棄されますが、
Enter Play Mode Settingsを有効にした状態だと破棄されません。
例えば再生終了時のイベント(Application.quitting)に処理を登録すると、
再生開始と終了を繰り返す度に実行される処理が増えていくのが分かります。
private void Start(){ //再生終了時のイベントに処理を登録 Application.quitting += Quit; } //再生終了時に実行される private static void Quit(){ Debug.Log("再生終了"); }
この問題もRuntimeInitializeOnLoadMethodを使い、
再生時にイベントに登録してある処理を破棄する事で解決出来ます。
[RuntimeInitializeOnLoadMethod] private static void Init(){ //再生終了時のイベントに登録してある処理を登録を破棄 Application.quitting -= Quit; } private void Start(){ //再生終了時のイベントに処理を登録 Application.quitting += Quit; } //再生終了時に実行される private static void Quit(){ Debug.Log("再生終了"); }