using Unity.Pipeline.HotReload; using UnityEngine; namespace WL.Diagnostics { /// /// 핫리로드 동작 확인용 프로브 — 검증 때만 임의 GameObject 에 붙였다 뗀다 (WLAutoProbe 와 같은 성격, 씬에 상주시키지 않음). /// /// 사용 순서 /// 1) Play 진입 (unity command editor_play) 후 eval 로 붙인다 — Play 중엔 create_gameobject/add_component 가 거부된다: /// unity command eval --code "new UnityEngine.GameObject(\"HotReloadProbe\").AddComponent(); return 1;" /// 2) 아래 Tick() 본문(문구·계산 등)을 고쳐 저장한다 /// 3) unity command reload_file --filename Assets/WL/Scripts/Debug/WLHotReloadProbe.cs /// 4) 콘솔에 바뀐 문구가 찍히면 성공 — 도메인 리로드 없이 반영된 것이다 /// /// 규칙 (hot-reload.md): [HotReload] 메서드는 public · 반환 void 또는 IEnumerator · 본문이 만지는 멤버는 **public** 만 /// (private setter 프로퍼티·private 필드는 리로드 컴파일이 실패한다 — 2026-09-03 실측). 리로드 직후 상태 재초기화는 [OnHotReload]. /// public class WLHotReloadProbe : MonoBehaviour { [SerializeField] private float intervalSeconds = 2f; private float _nextTickTime; /// Tick() 호출 횟수 (리로드를 거쳐도 유지된다). [HotReload] 본문이 쓰므로 public 필드. public int TickCount; [HotReload] public void Tick() { TickCount++; Debug.Log($"[WLHotReloadProbe] tick #{TickCount} — 이 문구를 바꾸고 reload_file 로 적용해 보세요"); } private void Update() { if (Time.unscaledTime < _nextTickTime) return; _nextTickTime = Time.unscaledTime + intervalSeconds; Tick(); } [OnHotReload] private void OnCodeReloaded() { Debug.Log($"[WLHotReloadProbe] 핫리로드 적용됨 (tick={TickCount})"); } } }