Project_WL/Assets/WL/Scripts/Debug/WLHotReloadProbe.cs

49 lines
2.1 KiB
C#
Raw Normal View History

using Unity.Pipeline.HotReload;
using UnityEngine;
namespace WL.Diagnostics
{
/// <summary>
/// 핫리로드 동작 확인용 프로브 — 검증 때만 임의 GameObject 에 붙였다 뗀다 (WLAutoProbe 와 같은 성격, 씬에 상주시키지 않음).
///
/// 사용 순서
/// 1) Play 진입 (unity command editor_play) 후 eval 로 붙인다 — Play 중엔 create_gameobject/add_component 가 거부된다:
/// unity command eval --code "new UnityEngine.GameObject(\"HotReloadProbe\").AddComponent<WL.Diagnostics.WLHotReloadProbe>(); 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].
/// </summary>
public class WLHotReloadProbe : MonoBehaviour
{
[SerializeField] private float intervalSeconds = 2f;
private float _nextTickTime;
/// <summary>Tick() 호출 횟수 (리로드를 거쳐도 유지된다). [HotReload] 본문이 쓰므로 public 필드.</summary>
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})");
}
}
}