コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】Unity 2019.3 には高速にプレイモードを開始する実験機能が存在する

はじめに

上記の公式の記事によると、ドメインのリロードをスキップすることで
高速でプレイモードに入れるようになる実験的な機能が
Unity 2019.3 には存在するとのことなので、触ってみました

概要

f:id:baba_s:20191105233714g:plain

デフォルトでは、プレイモードに入るまでにこのくらい時間がかかる場合でも

f:id:baba_s:20191105231756p:plain

Unity メニューの「Edit > Project Settings」から

f:id:baba_s:20191105231829p:plain

「Editor」の「Enter Play Mode Options (Experimental)」をオンにすることで

f:id:baba_s:20191105233721g:plain

このように高速でプレイモードに入ることができるようになります

注意点として、ドメインのリロードがスキップされてしまうので

using UnityEngine;

public class Example : MonoBehaviour
{
    private static int m_count = 0;

    private void Awake()
    {
        Debug.Log( ++m_count );
    }
}

例えば、上記のように static 変数を使用してる場合、

f:id:baba_s:20191105232603g:plain

通常なら Unity を再生するたびに static 変数はリセットされますが、

f:id:baba_s:20191105232633g:plain

「Enter Play Mode Options (Experimental)」をオンにした場合は
static 変数の値が初期化されずに残ってしまいます

using UnityEngine;

public class Example : MonoBehaviour
{
    private static int m_count = 0;

    [RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.SubsystemRegistration )]
    private static void Init()
    {
        m_count = 0;
    }

    private void Awake()
    {
        Debug.Log( ++m_count );
    }
}

そのため、RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.SubsystemRegistration ) を使用して
Unity 再生前に static 変数の値を初期化する処理を書く必要があるとのことです

using UnityEngine;

public class Example : MonoBehaviour
{
    private void Awake()
    {
        Application.quitting += Quitting;
    }

    private static void Quitting()
    {
    }
}

他にも、上記のようにイベントにコールバックを登録する場合も

using UnityEngine;

public class Example : MonoBehaviour
{
    [RuntimeInitializeOnLoadMethod]
    private static void Init()
    {
        Application.quitting -= Quitting;
    }

    private void Awake()
    {
        Application.quitting += Quitting;
    }

    private static void Quitting()
    {
    }
}

RuntimeInitializeOnLoadMethod を使用して
イベントからコールバックを解除する必要があるとのことです

参考サイト様