今回は久々にTwitterネタをやっていきます。
このようなツイートを見つけました。
Unity、たまに意図的にコンパイルそのものを止めたくなる時があるんだけど、何か良い手無いかな...。(主に複数のフォルダ整理やADF整理など)
— mao (@TEST_H_) 2020年8月6日
ちなみに自分は速攻でコンパイルエラーになるコードを仕込むことで、完了時間を短くした状態で整理すると言う力技で対処したことならある。
私も複数のアセットをインポートした時はAsset/AssetStoreというフォルダを作りまとめたりしますが、
フォルダを移動するたびにコンパイルが走るのが実に煩わしいところ。
そこで、Unityのコンパイルを無効化する方法についてまとめました。
- 開発環境
- 方法1 Auto Refreshを切る(うまくいかなかった)
- 方法2 LockReloadAssembliesとUnlockReloadAssembliesをエディタ拡張から叩く
- 方法3 Playモード中を利用する
- まとめ
- 参考資料
開発環境
Unity 2020.1.0f1
方法1 Auto Refreshを切る(うまくいかなかった)
同ツイートのリプライにあった方法です。
これ? pic.twitter.com/nYuXdviDbf
— リゼ (@archeleeds) 2020年8月6日
Preferences/General/AutoRefreshのチェックを外し、アセットのリフレッシュを無効化します。
※リフレッシュとはアセットの変更をAssetDatabaseにコミットして、プロジェクト内のアセットを最新の状態にすることです
リフレッシュ自体はCtrl+Rや、Assets/Refreshで実行できます。
ただし、この方法ではうまくいきませんでした。
Scriptの編集、及びフォルダやファイルの移動でコンパイルが走りました。
方法2 LockReloadAssembliesとUnlockReloadAssembliesをエディタ拡張から叩く
同ツイートのリプライにあった方法です。
LockReloadAssembliesとUnlockReloadAssembliesをエディタ拡張から叩くようにすればできるかもしれません。
— TechNΘ (@Techno1109) 2020年8月6日
Editor拡張でLockReloadAssembliesを呼ぶとコンパイルがロックされ、
UnlockReloadAssembliesを呼ぶとアンロックされるようです。
今回は以下のScriptをEditorフォルダに置きました。
using UnityEngine; using UnityEditor; public class CompileLock : MonoBehaviour { [MenuItem("Compile/Lock", false, 1)] static void Lock () { Debug.Log("コンパイルしなくなります"); EditorApplication.LockReloadAssemblies(); } [MenuItem("Compile/UnLock", false, 1)] static void Unlock () { Debug.Log("コンパイルするようになります"); EditorApplication.UnlockReloadAssemblies(); } }
すると、UnityエディターのメニューバーにCompileという項目が増えます。
さらにCompile/Lockを押すとコンパイルがされなくなり、Compile/UnLockで解除されます。
Lockしている時にScriptを編集すると、Unityエディターの右下に鍵マークが表示されました。
コンパイル中だとクルクル回る所ですね。鍵マークが表示されている時はコンパイルされないようです。
同じく、ファイルやフォルダの移動でもコンパイルは走りませんでした。
※アセットのインポートではコンパイルが走ります。
追記 8月7日
@deco_c_さんが改良版のEditorScriptを作成してくださいました!
gistにあげたhttps://t.co/AjsLEzGNpu
— Decoc (@deco_c_) 2020年8月6日
方法3 Playモード中を利用する
同ツイートのリプライにあった方法です。
やったことないからうまくいくかわからんけど
— ぜのぺ (@xenopaper) 2020年8月6日
プレイモード中はコンパイルかからないモードにしておいて、プレイモード中に入れ替えたらそれっぽくできたりしないだろうか…
Playモード(ゲーム実行)中にスクリプトなどが変更された場合の挙動は、
Preferences/General/ScriptChangesWhilePlayingから変更できます。
これには3つのモードが用意されています。
Recompile And Continue Playing
プレイモード中にScriptが変更された場合、プレイモードを続行したままコンパイルします。
Unityにはホットリロードと呼ばれる、Scriptの変更をゲームを終了させずに反映できる機能があります。
ホットリロードを有効にするのがこのモードです。
Recompile After Finished Playing
プレイモード中にScriptが変更された場合、プレイモードはそのまま続行できますがコンパイルはされず、
プレイモードの終了後にコンパイルされるモードです。
Stop Playing And Recompile
プレイモード中にScriptが変更された場合、プレイモードを即終了しコンパイルを行うモードです。
今回は、プレイモード中にコンパイルしないようにしたいので、
Recompile After Finished Playingに設定します。
実際にプレイモード中にScriptを編集したところ、
方法2と同じように鍵マークが表示されコンパイルされませんでした。
ファイルやフォルダの移動をしても同じようにコンパイルが走りません。
ただし、プレイモード中はアセットのインポートができないので注意しましょう。
まとめ
以下の2つの方法でUnityのコンパイルを無効化できる。
・LockReloadAssembliesとUnlockReloadAssembliesをエディタ拡張から叩く
・ScriptChangesWhilePlayingをRecompile After Finished Playingにする
参考資料
他わかりにくい所、間違っている所がありましたらコメントまでおねがいします!