【Unity】スクリプトを変更するたびにコンパイルが走らないようにする

Unity を使用中にエディタでスクリプトを編集 → 保存すると Unity 上でスクリプトのコンパイルが実行され、その都度作業が中断されるのを防止する設定です。

スクリプトのコンパイルが走ると画面右下のチェックマークが回転するプログレスに変化して

Unity エディタ上にこんな感じのダイアログが出て作業ができなくなります。

確認環境

  • Unity 2021.3.4f1
  • VisualStudio 2022

設定方法

// Unity 2021.3 の設定の場所
Edit > Preferences... > Asset Pipeline > Auto Refresh を OFF

// 少し古い Unity の設定の場所
Edit > Preferences... > General > Auto Refresh を OFF

スクリプトを自分でコンパイルしたいときは、Crtl + R で自分で手動でスクリプトをコンパイルすることになります。

再生したときに必ずコンパイルが走るようにする

このままだと手動で Ctrl + R を押さないと スクリプトやアセットが反映されないので、再生ボタンを押したときに必ずコンパイルやアセットのリフレッシュが行われるようにします。

以下のコードを自分のスクリプトのどこでもよいので貼り付けます。

#if UNITY_EDITOR

using UnityEditor;

/// <summary>
/// エディタ再生前にアセットを更新します。
/// </summary>
public class RefreshPlay
{
    // 説明:
    // スクリプトを変更してUnityに戻ってくるたびにリロードが走ると
    // 固まったような状態になって度々作業が中断されてしまう。
    // 
    // これを回避するためにまず、以下の設定をOFFに設定する
    // Edit > Prefe.. > Asset Pipiline > Auto Refresh
    //
    // そうすると [Ctrl + R] でしか更新されなくなるが
    // 今度は Play したときに更新されずに実行されてしまうので
    // 以下のスクリプトで実行前にアセットの強制リフレッシュを行う動作を割り込ませて
    // 実行時には最新の状態が保たれるようにするスクリプト

    [InitializeOnLoadMethod]
    public static void Run()
    {
        EditorApplication.playModeStateChanged += (PlayModeStateChange state) =>
        {
            if (state == PlayModeStateChange.ExitingEditMode)
            {
                AssetDatabase.Refresh();
            }
        };
    }
}

#endif

これで「変更するたびにコンパイルが走らない」、「再生するときは必ずコンパイルされる」状態になりました。