コガネブログ

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

【Unity】Unity 再生中にスクリプトの変更を反映できる「Fast Script Reload」紹介

はじめに

「Fast Script Reload」を Unity プロジェクトに導入することで
Unity 再生中にスクリプトの変更を反映できる(ホットリロードできる)ようになります

使い方

導入時に上記のダイアログが表示されたら「OK」を押して Auto Refresh を無効にします

「OK」以外を押してしまった場合は Preferences の
「Asset Pipeline > Auto Refresh」を「Disabled」にします

そして、試しに Unity 再生中にログ出力する文字列を変えて保存してみると
Unity を再生したまま変更が反映されるようになったことが確認できます

設定の変更

Unity メニューの「Window > Fast Script Reload > Start Screen」を押して

表示されたウィンドウで設定を変更できます

もしくは Preferences の「Fast Script Reload」から変更できます

ホットリロードの間隔の変更

Preferences の「Fast Script Reload」の
「Batch script changes and reload every N seconds」を変更することで
ホットリロードの間隔(デフォルトは 3 秒)を設定できます

ホットリロード時に呼ばれるコールバック

using UnityEngine;

public class Example : MonoBehaviour
{
    private void OnScriptHotReload()
    {
        Debug.Log( "OnScriptHotReload" );
    }
    
    private static void OnScriptHotReloadNoInstance()
    {
        Debug.Log( "OnScriptHotReloadNoInstance" );
    }
}

OnScriptHotReload という名前の関数や
OnScriptHotReloadNoInstance という名前の static 関数を定義すると
ホットリロード時に呼び出されます

無視リストに追加

スクリプトを右クリックして「Fast Script Reload > Add Hot-Reload Exclusion」を押すと
そのスクリプトはホットリロードの対象外になります

「Fast Script Reload > Show Exclusions」を押すと現在の無視リストを確認できます

using FastScriptReload.Runtime;
using UnityEngine;

[PreventHotReload]
public class Example : MonoBehaviour
{
}

PreventHotReload 属性を付与することで無視することも可能です

ホットリロードに対応していない変更

上記のページでホットリロードに対応していないスクリプトの変更がまとめられています たとえば「ジェネリッククラス」や「ジェネリックメソッド」などが未対応のようです

公式ドキュメント

詳細な使い方は上記のページで紹介されています