コガネブログ

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

【Unity】無限ループでフリーズした Unity を復帰させる方法

まとめ

Windows なら Asset Store の「Emergency Exit」を使うと
Ctrl + Shift + Q で無限ループを止められるようになります

Visual Studio や JetBrains Rider を使っているなら
以下のいずれかの方法で無限ループを止められます

  • ステートメントの設定で無限ループから抜ける
  • イミディエイトウィンドウでループカウンタを操作して無限ループから抜ける

この記事では上記の方法を行う手順を紹介していきます

目次

検証環境

  • Windows 10
  • Unity 2020.3.13f1
  • Microsoft Visual Studio Community 2019 16.11.2
  • JetBrains Rider 2021.1.3

Asset Store の「Emergency Exit」を使う

Windows であれば Asset Store で販売されている
「Emergency Exit」を購入して Unity プロジェクトに導入すると

using UnityEngine;

public class Example : MonoBehaviour
{
    private void Start()
    {
        while ( true )
        {
        }
    }
}

誤って上記のような無限ループを実行してしまっても

f:id:baba_s:20211122101721g:plain

Ctrl + Shift + Q で無限ループを止められるようになります

Visual Studio のステートメントの設定を使う

using UnityEngine;

public class Example : MonoBehaviour
{
    private void Start()
    {
        int i = 0;
        while ( i < 10 )
        {
            // i++ されていないので while が終わらない
        }

        Debug.Log( $"i = {i}" );
    }
}

上記のようにループカウンタのインクリメントを忘れているコードがあるとします

f:id:baba_s:20211122123804p:plain

Unity を Debug Mode にした状態で Unity を再生します

f:id:baba_s:20211122123807p:plain

無限ループに入ったら Visual Studio の「Unity にアタッチ」を実行して

f:id:baba_s:20211122123809p:plain

ブレークポイントを設定します

f:id:baba_s:20211122123812g:plain

そして、黄色の矢印をドラッグして無限ループの外に移動してから「続行」を押します

f:id:baba_s:20211122123824p:plain

これで、ループカウンタの i の数値が 0 のまま無限ループを抜けることができます

f:id:baba_s:20211122124650g:plain

黄色の矢印をドラッグする以外にもコードを右クリックして
「次のステートメントの設定」を押すことでも無限ループの外に移動できます

f:id:baba_s:20211122131118g:plain

f:id:baba_s:20211122131123g:plain

JetBrains Rider でも同様のことは可能です

Visual Studio のイミディエイトウィンドウを使う

f:id:baba_s:20211122125111p:plain

Visual Studio メニューの「デバッグ > ウィンドウ > イミディエイト」を選択して
イミディエイトウィンドウを表示します

f:id:baba_s:20211122125114g:plain

無限ループにブレークポイントを設定したらイミディエイトウィンドウで
無限ループを抜け出せるように変数の値を変更して「続行」を押します
上記の例ではループカウンタに 99 を設定して while を抜けられるようにします

f:id:baba_s:20211122125120p:plain

これで、ループカウンタの i の数値が 99 になり無限ループを抜けることができます

f:id:baba_s:20211122131151g:plain

JetBrains Rider でも同様のことは可能です

Update 関数の中で無限ループが発生している場合

f:id:baba_s:20211122125123g:plain

Update 関数の中で無限ループが発生してしまう場合は
一度無限ループを抜け出してもすぐに次のフレームで無限ループに入ってしまいます
このような場合はイミディエイトウィンドウで Debug.Break() を実行します

f:id:baba_s:20211122125133p:plain

これで、無限ループを抜けた後に Unity が一時停止状態になるため、
Unity で問題の調査ができるようになります

イミディエイトウィンドウでできないこと

f:id:baba_s:20211122130013p:plain

例外を投げたり return や break で無限ループを抜けることはできません

参考サイト様