MRが楽しい

MRやVRについて学習したことを書き残す

Unityでスクリプトからエディターの再生を一時停止する

本日はUnityの小ネタ枠です。
Unityでスクリプトからエディターの再生を一時停止する方法です。

Debug.Break

Debug.Breakはエディターを一時停止するUnityのデバッグ関数です。
本関数を利用してエラーコードに分岐したときなど、任意のタイミングでスクリプトからエディターを一時停止できます。
docs.unity3d.com

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    void Start()
    {
        Debug.Break();
    }
}

サンプルスクリプト

Debug.Breakの動作を確認するため、毎フレームUpdate関数でDebug.Breakを行う以下のサンプルスクリプトを作成しました。
・BreakTest.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BreakTest : MonoBehaviour
{
    private int count = 0;
    
    void Update()
    {
        count++;
        Debug.Log($"count : {count}");
        
        // Debug.Breakでエディタの実行を一時停止
        Debug.Break();
    }
}

シーンを再生すると以下の通り即座にシーンが一時停止します。

この一時停止は[一時停止]ボタンを押すと解除できます。

Debug.Breakによる停止タイミング

Debug.Breakによる停止はコードの該当箇所で即座に停止するわけではなく、本メソッドが実行されたライフサイクルが全て完了したタイミングで停止します。
このため、以下のようにStart関数の初めでDebug.Breakを実行してもフレーム内のその後のコードやUpdate関数などは実行されます。
・BreakTest2.cs

using UnityEngine;

public class BreakTest2 : MonoBehaviour
{
    void Start()
    {
        Debug.Log($"Start : {Time.frameCount}");
        
        // Debug.Breakでエディタの実行を一時停止
        Debug.Break();

        // Breakによる停止はライフサイクルが完了したのちに実行されるので
        // 以下のログやUpdate, LateUpdateは実行される
        Debug.Log($"Start Complete : {Time.frameCount}");
    }

    private void Update()
    {
        Debug.Log($"Update : {Time.frameCount}");
    }

    private void LateUpdate()
    {
        Debug.Log($"LateUpdate : {Time.frameCount}");
    }
}