目的:Playボタン押下〜実行までの待ち時間と、再コンパイル時間を最短にする
対象:Unity(C#)+ Visual Studio(フル IDE)。VS Code は対象外
🔰 TL;DR(最初の10分でやること)
-
Enter Play Mode Options をON
-
Edit > Project Settings > Editor
-
✅
Enter Play Mode Options: ON
-
✅
Reload Domain: OFF
(まずOFFに挑戦) -
◻️
Reload Scene: ON
(最初はONのまま。慣れたらOFFも検討)
-
-
asmdef を 3〜5個に分割(再コンパイル範囲を最小化)
- 例:
Game.Runtime / Game.Editor / ThirdParty
- 例:
-
Editor用コードは
Editor/
に隔離(可能なら Editor 用 asmdef も) -
VSの重い機能は必要時のみON(CodeLens / アナライザ / 不要拡張)
1) Enter Play Mode Options(Play開始の“再起動”をサボる)
何が速くなる?
- Play開始時の C#ドメイン再読み込み と シーン再読み込みを省略
→ 待ち時間が体感で激減。プロトタイピングが爆速化
設定場所
Edit > Project Settings > Editor
-
Enter Play Mode Options … ON
-
Reload Domain … OFF(推奨)
-
Reload Scene … ON(まずはON、慣れたらOFFも挑戦)
ハマりどころ(& 即解決の型)
問題1:静的変数がリセットされない
→ 起動時に明示リセットする
// 静的データのリセット(Domain Reload OFFでも確実に初期化) public static class GameStatics { public static int Score; [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] static void ResetStatics() { Score = 0; } }
問題2:イベント多重購読
→ OnEnable/OnDisable で購読・解除を徹底
void OnEnable() => EventBus.OnHit += HandleHit; void OnDisable() => EventBus.OnHit -= HandleHit;
問題3:初期化順が崩れる
→ Awake/OnEnable に初期化を寄せる(Start任せにしない)
Rigidbody rb; void Awake() { rb = GetComponent<Rigidbody>(); // ここで明示初期化 }
ワンタッチ切替(便利メニュー)
// Assets/Editor/PlayModeSpeedMenu.cs #if UNITY_EDITOR using UnityEditor; using UnityEngine; public static class PlayModeSpeedMenu { [MenuItem("Tools/Speed/EnterPlay: NoDomain + NoScene")] public static void NoDomainNoScene() { EditorSettings.enterPlayModeOptionsEnabled = true; EditorSettings.enterPlayModeOptions = EnterPlayModeOptions.DisableDomainReload | EnterPlayModeOptions.DisableSceneReload; Debug.Log("Enter Play Mode: NoDomain + NoScene"); } [MenuItem("Tools/Speed/EnterPlay: Default (Reload All)")] public static void DefaultReload() { EditorSettings.enterPlayModeOptionsEnabled = false; // 既定動作に戻す Debug.Log("Enter Play Mode: Default"); } } #endif
運用Tips
-
新規導入時は Domain OFF / Scene ON で安定確認 → 問題なければ Scene OFF に挑戦
-
アセットやプラグインと相性が出たら、一時的に「Default」に戻す
2) Assembly Definition(asmdef)で再コンパイルを“局所化”
目的
- スクリプト変更時に 必要なアセンブリだけ ビルドさせる
→ 増やすほど速いわけではない。最小構成からスタート
最小構成(例)
-
Game.Runtime.asmdef
(実行時) -
Game.Editor.asmdef
(Editor専用。Platforms: Editor のみ) -
ThirdParty.asmdef
(外部/共通)
依存の向き(例)
Game.Runtime → ThirdParty
Game.Editor → Game.Runtime
(Editor から Runtime を参照)
作り方メモ
-
対象フォルダを右クリック → Create > Assembly Definition
-
名前を付ける(上記例)
-
Editor 用は Platforms で Editor のみにチェック
-
参照が必要な asmdef を Assembly Definition References に追加
落とし穴
-
循環依存(A→B→A)はNG
-
Editor コードを Runtime に混ぜない(ビルドにも悪影響)
-
最初は 3〜5個、増やしすぎない
3) Editor/
フォルダに隔離(ビルド対象から外す)
何を入れる?
-
EditorWindow
、CustomEditor
、ビルドに不要なツール系コード
効果
-
ランタイムと分離 → ビルド軽量化・依存の混線防止
-
asmdef運用に慣れたら、Editor専用 asmdef にまとめるとさらに管理が楽
4) Visual Studio 側の軽量化(感じた時だけ手当て)
-
CodeLens を OFF(重いと感じたら)
Tools > Options > Text Editor > All Languages > CodeLens: Off
-
アナライザの負荷を抑える(保存時のみ / CIで厳密チェックなど役割分担)
-
不要拡張の停止(ミニマル構成から必要なものだけ戻す)
-
大規模ソリューションは Solution Filter(.slnf) で読み込み対象を絞るのも有効
5) 最初の導入レシピ(コピペOKの流れ)
-
Enter Play Mode
- ON / Domain OFF / Scene ON(慣れたら Scene も OFF)
-
静的初期化(
SubsystemRegistration
)と OnEnable/OnDisable を導入 -
asmdef を
Runtime / Editor / ThirdParty
で分割(依存は一方向) -
Editorコードは
Editor/
へ移動(可能なら Editor asmdef) -
VS の重機能は必要時だけ ON
6) フォルダ例(最小)
Assets/ Game/ Runtime/ Game.Runtime.asmdef Scripts/ ... Editor/ Game.Editor.asmdef PlayModeSpeedMenu.cs ThirdParty/ ThirdParty.asmdef
7) トラブルシュート早見表
症状 | よくある原因 | 速攻対処 |
---|---|---|
Play後、前回の値が残る | Domain Reload OFFで静的が残留 |
SubsystemRegistration で静的初期化 |
イベントが2重3重に発火 | OnEnable/OnDisable未実装 | 購読/解除を対で実装 |
最初の1回だけ動かない | Start依存の初期化 |
Awake/OnEnable に寄せる |
変更後の再コンパイルが遅い | asmdef 未分割/Editor混在 | asmdef分割、Editor隔離 |
VSが重い/カクつく | CodeLens/アナライザ/拡張 | 一旦OFF、必要だけ戻す |
✅ チェックリスト(貼って使う用)
-
Enter Play Mode:ON
-
Reload Domain: OFF
-
Reload Scene: ON(慣れたらOFF)
-
-
静的は
SubsystemRegistration
でリセット -
イベントは OnEnable/OnDisable で購読・解除
-
asmdef:
Runtime / Editor / ThirdParty
を作成 -
Editor/
にツール系を隔離(可能なら Editor asmdef) -
VS の重機能は必要時だけ ON(CodeLens / アナライザ / 拡張)