# WL813q Probe 2026-09-09 09:14:01 (edit mode · Play 0 · 로그인 0) playMode=False ── ⓪ 에셋 (WLRunUiSettings · NEW) [PASS] Resources.Load("WL/WLRunUiSettings") [PASS] Enabled(에셋·enabled_·RuntimeDisabled) = True 값: enabled_=True hud=True result=True topMargin=272px width=560px timerPx=56 warn=30s pulse=1.35×0.3s 문구: win="런 클리어!" timeout="시간 종료" next="다음 런" close="닫기" zone="존 {0}" boss="BOSS" 행 순서: TotalTime · BossClear · Kills · MaxChain · MaxDamage · Level · LootByGrade · Gold · DeathsPotions [PASS] 본문 행 9종(발주서 §1-2 순서) [PASS] Abandon 팝업 없음(기본값) [PASS] 부활 팝업 우선(기본값) [PASS] 813p WLRunSettings 존재(런 길이·존 수의 주인) 813p 값(읽기만): runSeconds=240 zoneSpawnerIds=4 zoneClearKills=[12,14,12,8] [PASS] WLLootSettings.GradeSlots = 9 → lootByGrade 길이 10(813p 계약) ── ① 노드 — NewGameUI 프리팹(저장 0) · Safe Area · 보스 바와 겹침 [PASS] LoadPrefabContents(Assets/Res_Addr/MainUI/NewGameUI.prefab) [PASS] IngameUIs/WL_HUD 경로 실측 [PASS] WL_HUD 가 SafeAreaFitter 아래 = Safe Area 안 (813y 실측 재확인) Bind HUD : 연결 IngameUIs/WL_HUD · pos(0.00, -483.56) size(995.56, 216.89) 칸=4 unitsPerPx=1.7778 Bind 결과 : 연결 IngameUIs/WL_HUD · box size(1528.89, 1920.00) 행틀=9 unitsPerPx=1.7778 [PASS] RunHud 노드 생성(WL_RunHud · HideFlags.DontSave) [PASS] RunResultUI 노드 생성(WL_RunResult · HideFlags.DontSave) [PASS] RunStarted 구독자 2(HUD+결과) — 실측 2 [PASS] 6종 구독 배선 = Tick1/Zone1/Gate1/Boss1/Ended2 보스 바 = 상단 190 ~ 256 px · 런 HUD 상단 = 272 px [PASS] 런 HUD 가 보스 HP 바 아래(겹침 0 · 여유 16.0 px) HUD 배치 : pos(0.00, -483.56) size(995.56, 216.89) 칸=4 unitsPerPx=1.7778 결과 배치: box size(1528.89, 1920.00) 행틀=9 unitsPerPx=1.7778 ── ② HUD — RunStarted → RunTick×3 → ZoneCleared×4 → BossGateOpened → BossStarted [PASS] RunStarted 수신 1 [PASS] 존 칸 4개 생성 — 실측 4 [PASS] HUD 표시 on [PASS] 타이머 리셋 = 04:00(runSeconds 240 · 페이로드에서) — 실측 "04:00" [PASS] 단계 = "존 1" — 실측 "존 1" tick1 timer="03:20" 존0 fill=0.50 단계="존 1" [PASS] 틱1 mm:ss = 03:20 [PASS] 틱1 존0 게이지 = 6/12 = 0.50 — 실측 0.500 [PASS] 틱2 mm:ss = 02:30 [PASS] 틱2 존0=1.00(클리어) · 존1=0.50 — 실측 1.00/0.50 [PASS] 틱2 단계 = "존 2" — 실측 "존 2" [PASS] 틱3 mm:ss = 00:25 [PASS] 마지막 30s 경고색 #FF4A47 — 실측 #FF4A47 [PASS] ZoneCleared 4회 수신 [PASS] 존 칸 4개 전부 채움 펄스 실측: 시작 scale=1.350 → 0.3s 뒤 1.000 [PASS] 존 클리어 펄스 1.35× → 0.3s 안에 1.0 복귀 [PASS] 게이트 개방 → 단계 라벨 "BOSS" [PASS] 보스 단계 색 #FF9E3D [PASS] BossStarted 수신 1 (boss=null 계약 경로 · 예외 0) [RunHud] 구독=True bound=True visible=True · started=1 tick=3 zoneCleared=4 gate=1 boss=1 ended=0 타이머 "00:25" (남은 25.0s · 경고=True · 쓰기 4회) · 단계 "BOSS" (쓰기 4회) 존 칸 4 (fill 쓰기 15회): [0]=1.00×1.00 [1]=1.00×1.00 [2]=1.00×1.00 [3]=1.00×1.00 노드 pos(0.00, -483.56) size(995.56, 216.89) active=True 부모=WL_HUD SafeArea=True edge = Font SDF Material (WL813y Edge) shader=TextMeshPro/Mobile/Distance Field outlineW=0.280 outlineC=0D0805FF underlay=000000CC off(0.50,-0.50) soft=0.22 UNDERLAY_ON=True 설정 enabled=True hud=True topMargin=272px width=560px timerPx=56 warn=30s pulse=1.35×0.3s ── ③ 결과 화면 — RunEnded(Win) [PASS] RunEnded 수신 1 [PASS] 결과 화면 표시(부활 팝업 없음) [PASS] 제목 = "런 클리어!" — 실측 "런 클리어!" [PASS] 런 종료 → HUD 숨김(runHudHideOnEnd) [PASS] 복사본 스칼라 = 입력과 일치(outcome/runIndex/total/kills/boss/chain/level/gold/deaths/potions/zones) 행 값 실측: 총 시간 = "02:34" 보스 처치 = "02:34" 처치 수 = "99 (보스 1)" 최대 연쇄 = "9" 최대 피해 = "8889" 레벨 = "11 → 14" 등급별 = "7 3 2 1" 골드 = "777" 사망/물약 = "2 / 3" [PASS] 총 시간 154s → 02:34 [PASS] 보스 처치 153.5s → 02:34(올림) [PASS] 처치 수 = 99 (보스 1) [PASS] 최대 연쇄 = 9 [PASS] 최대 피해 = 합산(maxDamageBurst 8888.5 → 8889 · 0.5 는 올림) · 단일(1234.5)이 아니다 — 실측 "8889" [PASS] 레벨 11 → 14 [PASS] 골드 = 777 [PASS] 사망/물약 = 2 / 3 [PASS] 등급별 획득 = 1급 7 · 2급 3 · 4급 2 · 9급 1 (0 인 등급 생략 · 4칸) [PASS] 등급 색 태그 4개(813f 팔레트 + 813y 밝기 하한) — 실측 4 등급 색: 1= 2= 4= 9= [PASS] 본문 9행 표시 — 실측 9 [RunResultUI] 구독=True bound=True open=True pending=False · ended=1 shows=1 defer=0 next=0 close=0 abandon생략=0 버퍼증설=0 공용팝업=False 제목 "런 클리어!" · 행 9개 · 부활팝업Busy=False - TotalTime : "02:34" - BossClear : "02:34" - Kills : "99 (보스 1)" - MaxChain : "9" - MaxDamage : "8889" - Level : "11 → 14" - LootByGrade : "7 3 2 1" - Gold : "777" - DeathsPotions : "2 / 3" 복사본 outcome=Win runIndex=2 total=154.0s bossClear=153.5s kills=99(보스 1) chain=9 dmg=1234.5/8888.5 lv=11→14 lootTotal=13 gold=777 deaths=2 potions=3 복사 배열 zone(4): [0]=31.5/12 [1]=62.3/14 [2]=95.0/12 [3]=-1.0/5 · loot(10): 0 7 3 0 2 0 0 0 0 1 본문 = 런 클리어! | 총 시간 : 02:34 | 보스 처치 : 02:34 | 처치 수 : 99 (보스 1) | 최대 연쇄 : 9 | 최대 피해 : 8889 | 레벨 : 11 → 14 | 획득 : 7 3 2 1 | 골드 : 777 | 사망 / 물약 : 2 / 3 | 설정 enabled=True result=True 공용팝업=False abandon표시=False 부활우선=True box=(860.00, 1080.00) 행수=9 합산피해=True ── ④ 🔴 배열 3종 즉시 복사(813p 재사용 계약) — 원본을 덮어써도 화면 값 불변 [PASS] zoneClearSec 참조가 원본과 다르다(자기 버퍼) [PASS] zoneKills 참조가 원본과 다르다(자기 버퍼) [PASS] lootByGrade 참조가 원본과 다르다(자기 버퍼) [PASS] 존 배열 값 불변 — clearSec[0]=31.50 kills[0]=12 (원본은 −999 로 덮어씀) [PASS] loot 배열 값 불변 — [1]=7 (원본은 999) [PASS] 결과 화면 등급 줄 문자열 불변 원본 배열 현재값: zoneClearSec[0]=-999 zoneKills[0]=-999 loot[1]=999 [PASS] 두 번째 복사에서 버퍼 증설 0(런마다 배열 할당 0) — 증설 누계 0 ── ⑤ 시간 종료(Timeout) [PASS] 결과 화면 표시 [PASS] 제목 = "시간 종료" — 실측 "시간 종료" [PASS] 보스 처치 −1 → "—"(미발생 대시) [PASS] 보스 처치 0 ── ⑥ 이탈(Abandon) — 팝업 없음 · HUD 리셋만 [PASS] 팝업 0 (open=False) [PASS] 표시 호출 0 (누계 2) [PASS] Abandon 생략 카운터 +1 [PASS] 대기(pending) 0 — 나중에 저절로 뜨지 않는다 [PASS] HUD 숨김(리셋) ── ⑦ 813i/813tj 부활 팝업과 동시 — 부활 우선 · 결과는 닫힌 뒤 [PASS] 프리팹에서 ReviveDialog 발견 — 1개 ReviveDialog.Initialize : initialized · 폴백 팝업 box size(1351.11, 675.56) unitsPerPx=1.7778 ReviveDialog.ShowNowOnce: 폴백 팝업 표시 msg="존 시작점에서 부활합니다. 무료" [PASS] 부활 팝업 Busy = True [PASS] 결과 화면 아직 안 뜬다(부활 우선) [PASS] 결과 대기 중 = True [PASS] 미룸 카운터 +1 [PASS] 부활 팝업 닫힘 → Busy=false Tick: 런타임 패널 표시 outcome=Win 행=9 [PASS] 부활 팝업이 닫힌 뒤 결과 화면 표시 [PASS] 대기 해제 [다음 런] : 다음 런 — RunDirector.Restart() 호출 [PASS] [다음 런] 클릭 경로 = RunDirector.Restart() 1회 [PASS] [다음 런] 뒤 결과 화면 닫힘 RunDirector 상태: phase=Zones runIndex=4 restartCount=4 [닫기] : 닫기 [PASS] [닫기] 뒤 결과 화면 닫힘 ── ⑧ GC — 틱 100회 할당 0 (대조군 2종) 계기 = GC.GetTotalMemory (Boehm 힙 크기) + GC.CollectionCount(0) · GetAllocatedBytesForCurrentThread 절대값=0 (0 이면 이 런타임에 미구현 → 쓰지 않는다) 본시험(같은 초 100틱): ΔGetTotalMemory=0 B · gc0 340→340 · 표시 쓰기 31→31 (Δ할당 계기 참고값 0 B · 미구현) [PASS] 🔴 구조 증명: 값이 그대로면 SetText/fillAmount 쓰기 0회 = 만들 문자열 자체가 없다 [PASS] ΔGC = 0 B · gc0 불변 (RunTick 100회) 대조군 A(초가 바뀌는 100틱 · SetText 99회): ΔGetTotalMemory=0 B · gc0 343→343 — 우리 코드의 mm:ss 는 char 버퍼(문자열 0)이고, 에디터에서는 TMP 가 `#if UNITY_EDITOR m_text = InternalTextBackingArrayToString()` 로 인스펙터용 문자열을 만든다(빌드에는 없는 줄). 대조군 B(40,000자 문자열 200개 ≈ 16 MB): ΔGetTotalMemory=16384000 B · gc0 346→346 (sink=200) — 계기 감도 확인. 100 KB 규모는 Boehm 힙 여유분에 묻혀 Δ0 이 나온다(실측). [PASS] 측정 감도 있음(대조군 B ΔGetTotalMemory > 0) [PASS] mm:ss 경계값(0 · 음수 · 올림 · 240 · 상한 99:59) ── ⑨ C8 롤백 — enabled = 0 이면 HUD·결과 0 · 813p 는 그대로 [PASS] RuntimeDisabled=1 → Enabled=False HUD Tick: off — 무동작 결과 Tick: off — 무동작 [PASS] HUD 숨김 · 결과 닫힘 Bind(off): off — 조립 생략 [PASS] asset.enabled_=0 → Enabled=False (같은 게이트) [PASS] 복구 후 Enabled=True [PASS] 813p WLRunSettings.Enabled 불변 = True (런 구조는 그대로 동작) ── ⑩ 정리 — 구독 해제 · 노드 파괴 · 프리팹 저장 0 RunHud : teardown 완료 RunResultUI: teardown 완료 [PASS] RunEvents 구독자 전부 0 (Started 0 Tick 0 Zone 0 Gate 0 Boss 0 Ended 0) RunEvents.TotalRaised=11 last=RunTick · Dispatched(Tick)=820 [PASS] TimeScale 무접촉 = 1 UnloadPrefabContents — 프리팹 저장 0 RESULT PASS (pass=87 fail=0)