Enter Play Mode Options
- 「Enter Play Mode Options」を有効にすると、スクリプトやシーンの読み込みを省略するため、再生モードの開始が劇的に高速となる。
- スクリプトの実装によっては、上手く初期化されないケースがある。
- 静的変数が初期化されない。
- 静的イベントが初期化されない。
- 必要に応じて、「Reload Domain」あるいは「Reload Scene」のオプションを有効にする。
ドキュメント:
設定可能な再生開始時モード | Unity マニュアル [公式]
使い方
手順
メニューから「編集 > プロジェクト設定」 (Edit > Project Settings) を開き、「Editor」タブに切り替えて、「Enter Play Mode Setting」の項目を設定する。
設定
- Enter Play Mode Options: 再生モード開始時の読み込みオプションを有効にする (デフォルト:
無効
/※実験的機能)- Reload Domain: スクリプトを再読み込みする (デフォルト:
無効
) - Reload Scene: シーンを再読み込みする (デフォルト:
無効
)
- Reload Domain: スクリプトを再読み込みする (デフォルト:
ドキュメント:
設定可能な再生開始時モード | Unity マニュアル [公式]
Domain Reload | Unity マニュアル [公式]
Reload Scene | Unity マニュアル [公式]
Reload Domain と Reload Scene の無効化の詳細 | Unity マニュアル [公式]
参考:
Enter Play Mode Options で Editor 再生開始を早くする | KAZUPON 研究室
Enter Play Mode Settings – エディタ再生開始前の待ち時間を最大90%も削減する | kan のメモ帳
Enter Play Mode Options を設定すると爆速になった | TAKOYAKING’s blog
Unity 2019.3 には高速にプレイモードを開始する実験機能が存在する | コガネブログ
ゲームを再生する時間を短くする Configurable Enter Play Mode とは | 宴
Enter Play Mode Options – ゲーム再生までの時間を短くする | タニスゲームス
Unity 2019.3 で再生モードへの素早い切り替えが可能に | Unity Blog [公式]
Insanely fast enter to play mode – Unity Forum
Long time to enter play mode – Unity Forum
静的変数を初期化する
ドメインリロードを省略した場合、再生モードの開始時に静的変数が初期化されなくなるため、RuntimeInitializeOnLoadMethod
属性を付与した静的メソッドで明示的に初期化する。
public class Example : MonoBehaviour
{
static bool initialized = false;
[RuntimeInitializeOnLoadMethod(
RuntimeInitializeLoadType.SubsystemRegistration)]
static void Init()
{
initialized = true;
}
}
Code language: C# (cs)
仕様
- ゲームがランタイムで読み込まれる際に、一連の
Awake
メソッドの後に呼び出される。 - 複数のメソッドに属性を付与した場合、実行順序は保証されない。
ドキュメント:
UnityEngine.RuntimeInitializeOnLoadMethodAttribute | Unity スクリプトリファレンス [公式]
参考:
Unity 2019.3 には高速にプレイモードを開始する実験機能が存在する | コガネブログ
エディターウィンドウ
カスタムエディターウィンドウで、再生モードの開始時に処理を適用するには、EditorApplication.playModeStateChanged
イベントにハンドラを追加して、状態を判別して処理を実行する。
public class ExampleWindow : EditorWindow
{
[MenuItem("Tools/Example Window")]
public static void OpenTestWindow()
{
GetWindow<ExampleWindow>("Example");
}
private void OnEnable()
{
EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;
EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
}
private void OnDisable()
{
EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;
}
private void OnPlayModeStateChanged(PlayModeStateChange state)
{
if (state == PlayModeStateChange.EnteredPlayMode)
{
Debug.Log("Entered Play Mode in Example Window!");
}
}
}
Code language: C# (cs)
ドキュメント:
EditorApplication.playModeStateChanged | Unity スクリプトリファレンス [公式]
PlayModeStateChange | Unity スクリプトリファレンス [公式]
参考:
How to tell when returned to editor mode from play mode? (EditorWindow) – Unity Forum
プライベート配列がヌルに初期化されない
現象:
praivate
または internal
が指定された配列、または、リストが null
に初期化されない。
対処法:
- 該当する配列、または、リストに
NonSerialized
属性を付与する。
参考:
Just so you know, the generic workaround that WE found is… (Hyp-X) – Unity Forum
Awake が呼び出されない
現象:
シーンの再読み込みを省略すると、クラスに ExecuteInEditMode
属性、または、ExecuteAlways
属性が指定されている場合、Awake
メソッドが呼び出されなくなる。これは現在のところ、ドメインリロードを省略した場合の仕様となっている。(既知の問題)
代替
OnEnable
Start
参考:
Awake is no longer called for some MonoBehaviour types – Unity Forum
InitializeOnEnterPlayMode
※ Unity 2019.3 以降
エディターで再生モード開始時に呼び出したい静的メソッドに InitializeOnEnterPlayMode 属性を付与する。
public class Example : MonoBehaviour
{
#if UNITY_EDITOR
[InitializeOnEnterPlayMode]
static void Init(EnterPlayModeOptions options)
{
Debug.Log("Entering Play Mode");
}
#endif
}
Code language: C# (cs)
ドキュメント:
UnityEditor.InitializeOnEnterPlayModeAttribute | Unity スクリプトリファレンス [公式]
参考:
InitializeOnEnterPlayMode 属性を指定した関数は再生時に呼び出される | コガネブログ
Play ボタン押したときにメソッドを実行したいときの新機能 | ハルシオンシステムの気ままBlog
初期化サイクル
ドキュメント:
Reload Domain と Reload Scene の無効化の詳細 | Unity マニュアル [公式]
参考:
フォーラム
Configurable Enter Play Mode – Unity Forum
API
UnityEngine.RuntimeInitializeOnLoadMethodAttribute | Unity スクリプトリファレンス [公式]
UnityEditor.InitializeOnEnterPlayModeAttribute | Unity スクリプトリファレンス [公式]
EditorApplication.playModeStateChanged | Unity スクリプトリファレンス [公式]
PlayModeStateChange | Unity スクリプトリファレンス [公式]
EditorSettings.enterPlayModeOptionsEnabled | Unity スクリプトリファレンス [公式]
EditorSettings.enterPlayModeOptions | Unity スクリプトリファレンス [公式]
EnterPlayModeOptions | Unity スクリプトリファレンス [公式]
まとめ
ゲームを再生する時間を短くする Configurable Enter Play Mode とは | 宴
チュートリアル
開発効率アップ! Enter Play Mode オプション解説 (Unity Japan)
Enter Play Mode Settings – ゲームの調整を楽にする (Unity Japan)
Enter Play Mode Faster (passivestar)
Enter Play Mode Menu Item
リポジトリ:
baba-s/Kogane.EnterPlayModeMenuItem: メニューから Enter Play Mode の有効/無効を変更できるエディタ拡張 – GitHub