Project_WL/Assets/WL/Settings/WL813e_ZoneApply.md

9.1 KiB
Raw Blame History

WL-813e — 군중 존 5개 + 보스 아레나(Anubis) 데이터 적용 기록

발주 WL-813e (PD #813 · 트랙 S) · 브랜치 wl/systems/WL-813e-zones-boss (base wl/systems/WL-813b-boss-content @ a4a053c44) 규격 = 813b 완료보고 §6 + 초안 2건(_WL813b_MonsterAppear_Draft.json · _WL813b_BossArena_Draft.json) + 핵앤슬래시 기준서 v1 §B 요소 1·6 · §D-1 813e 행 코드 변경 0Assets/Script/** 무수정. 보스 프리팹(Res_Addr/Mobs/FieldBoss/Anubis.prefab) 인스펙터 값 무수정(813h 가 테이블화).

🔴 SOT — xlsm 동기화 필요

데이터 SOT 는 butler.xlsm (PD 소유) 다. 아래 6행은 MonsterAppear.json 에 직접 추가했으므로, xlsm 의 MonsterAppear 시트에 같은 6행을 넣고 재익스포트하기 전까지는 다음 익스포트에서 사라진다. WL_Nature.prefab 의 스포너 재바인딩(1~5 → 813001~813005)도 같이 살아 있어야 짝이 맞는다.

1. 반영한 것 (전수)

(a) Assets/ResWork/Table/Export/MonsterAppear.json — 새 행 6개 (기존 46행 바이트 무변경)

SpawnerID Lv ATK DEF/MDEF HP s_AppearMonster e_SpawnerType 리젠 s 최대 순찰 Exp/Gold
813001 존1 첫 교전 1 10 0 300 101|102|103|104 (Batty 4 · scale 1.5) Random 1.5 12 8 10/1
813002 존2 밀집 최대 2 12 0 450 168~172 (Porin 5 · scale 1.3) Random 1.2 15 8 15/2
813003 존3 혼합 3 14 0 600 173|174|175|146|147|151 (Racco 3 + Rabby 3) Random 1.2 14 8 20/3
813004 존4 웨이브 관문 4 16 0 800 118|119|120 (Devilu 3) PhaseAllKill 2.0 8 6 30/4
813005 존5 엘리트 5 20 0 1500 1014|1015|1016 (Golem Elite 3 · scale 2.5) Order 3.0 5 6 60/8
813010 보스 아레나 6 18 0 450 10006 (Anubis) Random 60 1 4 500/100
  • n_DropReward 는 6행 모두 기존 백 9700001(전 스포너 공용). 새 백은 813f 소관.
  • 813010 만 초안 값에서 바꿨다: 초안 행은 n_MonsterHP 1200(실 HP 20×1200 = 24,000 ≈ 240s)인데 초안 자신의 _계산 과 기준서 §B 요소6(보스 60~120 s · 첫 보스 90 s 목표)에 어긋난다. → 존1 의 3 s 처치(HP 300)가 함의하는 DPS 100 으로 역산: 450 = 90 s × 100 / f_BaseHPRate 20실 HP 9,000. ATK 18 은 초안대로(실 ATK 30×18 = 540). 플레이어 무적 유지 중이라 ATK 는 아직 체감에 영향이 없다.

(b) Assets/Res_Addr/Map/WL_Nature.prefab — 6줄 변경 + 새 노드 1기 (총 +86 / 5 줄)

무엇 변경
WL_Nature/maplv/1~5MobControlMgr.SpawnerID 1·2·3·4·5 → 813001~813005 (각 1줄)
WL_Nature 루트 Transform m_Children FieldBoss 컨테이너 1줄 추가
WL_Nature/FieldBoss/1 (신규) GameObject 2 + Transform 2 + FieldBossData 1 = YAML 문서 5개(80줄)

FieldBossData 값: n_MonsterID 10006 · n_SpawnerId 813010 · RegenTime 60 · isChapterBoss 0 · pos (139, 0.8, 20)

  • isChapterBoss 는 반드시 0. WL_Nature 의 MapData.m_ChapterPortal 이 null 이라 1이면 AfterDie 에서 NullReference (FieldBossData.cs:47-49) — 실측 확인.
  • 스포너 ID 6~19 와 다른 12개 맵(WL_Nature02~10 · WL_Start · Map_C01/02)은 손대지 않았다(ID 1~19 는 13개 맵 공용 · 813b 교훈).

2. 실측 (헤드리스 에디터 · AgentScripts/WL813e_Zones.cs)

항목
새 행 인식 6 / 6
스포너 → 행 연결 19 / 19 (미연결 0 = MobActor.cs:62 null 로 인한 NullReference 자리 0)
새 존 재바인딩 5 / 5
몹 프리팹 자산 누락 0 (존 21종 + 보스 1종 전부 Res_Addr/Mobs 에 실존)
FieldBossData 1기 · MonsterList 행 O · Res_Addr/Mobs/FieldBoss/Anubis.prefab O · MonsterAppear 행 O
보스 실 스탯 실 HP = 20 × 450 = 9,000 · 실 ATK = 30 × 18 = 540 (MyValue.cs:370-371)
동시 생존 · 풀 179마리 · 366개 (813b 기준 175 · 375 → 생존 +4 · 인스턴스 9)
NavMesh 도달성 스포너 19 + 보스 1 = PathComplete 20 / 20 · PathPartial 0
컴파일 게이트 PASS · error CS 0 · 콘솔 error 0

🔴 아레나 좌표를 초안에서 옮긴 이유 (813b 미확인 ③ 해소)

초안 후보A (137, 0.6, 22) 는 NavMesh 위(스냅 0.33 m)이긴 하나 플레이어 시작 지점(Portal_Start 115,0,10)에서 NavMesh.CalculatePath = PathPartial 이다 — 끊긴 구역이다. 같은 스윕에서 스포너 원점 19개는 전부 PathComplete 였으므로 프로브 문제가 아니다. → 후보A 주변 ±16 m 를 2 m 격자로 훑어 «시작에서 PathComplete + 모든 스포너 원점에서 15 m 이상» 을 만족하는 92개 중 후보A 에서 가장 가까운 (139, 0.8, 20) 을 채택했다(후보A 로부터 2.8 m · 경로장 38.4 m · 스냅 0.01 m · 최근접 스포너 20.1 m). 초안의 설계 의도(SP1·SP4 사이 · 시작에서 약 38 m · 군집 반경 10 밖)는 그대로 유지된다.

미확인

  • Play 실측(절두체 내 몹 수 · 처치 간격 · 보스 스폰 시각 · fps) = 「미확인」. 이 worktree 헤드리스 에디터에서 Assets/Resources/PlayFabSharedSettings.asset 이 임포트되지 않아 (Resources.LoadAll<PlayFabSharedSettings> = 0 · AssetDatabase.LoadAssetAtPath 도 null · 강제 재임포트·Refresh 후에도 동일) ServerInfo.Awake(ServerInfo.cs:45)가 IndexOutOfRangeException 으로 죽고 OnClick_DevLogin 이 진행되지 않는다. 파일·meta·스크립트 GUID 는 디스크에 정상 존재 → Library 시딩(robocopy) 잔재로 보이며 이번 변경과 무관하다. Play 는 Title 에서 시작·정지했고 씬 dirty 0 으로 되돌렸다.
  • 존 리듬의 절대 HP 값은 여전히 「제안값」이다. 플레이어 실 DPS 미측정(813m/813 S 트랙) — DPS 가 정해지면 n_MonsterHP = 목표 TTK × DPS / f_BaseHPRate 로 6행을 한 번에 다시 계산한다.
  • 보스 등장 방식은 맵 로드 즉시 상시 배치다(FieldBossData.Start()). "존 전멸 → 보스 스폰" 게이트는 코드가 필요해 813d(G)로 넘겼다.

3. 롤백

  1. MonsterAppear.json 에서 n_SpawnerID813001~813005·8130106행 삭제(기존 46행은 바이트 그대로라 앞부분은 손댈 필요 없다).
  2. WL_Nature.prefab: maplv/1~5SpawnerID1~5 로 되돌리고, FieldBoss 컨테이너(&8130050000000000001~&8130050000000000005 문서 5개)와 루트 Transform m_Children{fileID: 8130050000000000002} 줄을 지운다.
  3. 또는 병합 커밋을 git revert -m 1. 다른 맵·다른 스포너 행에 영향 0.

4. 다음 바퀴 값 조정 지점

# 무엇 근거
1 리젠 방식 — 기준서 §B 요소1 은 «존 전멸 후 4~6 s 일괄 재등장(PhaseAllKill)» 인데 이번엔 발주서 §1 이 지정한 초안 값(Random 1.2~1.5 s 개별 리젠)을 그대로 넣었다. 존1~3 을 PhaseAllKill + f_SpawnerDelay 4~6 으로 바꾸면 "비었다 → 다시 찬다" 페이싱이 생긴다. PhaseAllKill 은 인스턴스 = 종류×마릿수라 존3(6종×14=84)은 풀이 커진다 → 종류를 3~4 로 줄여야 한다 기준서 §B · MobControlMgr.cs:118-128, 213-224
2 보스 추적 사거리 — Anubis f_BaseChaseRange 50. 아레나 반경 20 을 넘어 존1(24 m)·존4(20 m)까지 끌려 나온다 → xlsm MonsterList 에서 15~20 으로 실측 · 초안 코드변경목록 3
3 드랍 — 존·보스 6행 전부 n_DropReward 9700001 공용 백, 보스 MonsterList.n_DropItem 0. 보스 3~5건 폭발 드랍은 새 백 필요 기준서 §B 요소4 · 813f
4 존5 마릿수 — 5마리는 기준서 «밀집 8~15» 밖이다. 의도적(엘리트 = «8~12 s 짜리 벽»)이지만 기준서 채점 시 요소1 로 세지 말 것 기준서 §B 요소1
5 보스 HP 재계산 — 450 은 DPS 100 「제안」 기반. 실 DPS 측정 후 재산출 위 미확인
6 존4 PhaseAllKill 총 길이 — 3웨이브 × 8마리 × 3 s ≈ 72 s + 웨이브 간 2 s. 모바일 3분 런 기준으로 길면 마릿수를 6 으로 MobControlMgr.cs:213-224

5. 검증 도구

AgentScripts/WL813e_Zones.cs (Assets 밖 · 게임 빌드에 안 들어간다)

unity command run_script --file AgentScripts/WL813e_Zones.cs --entry WL813e_Zones.Edit    # (a)~(f) 전수
unity command run_script --file AgentScripts/WL813e_Zones.cs --entry WL813e_Zones.Nav     # 스포너·보스 도달성 스윕
unity command run_script --file AgentScripts/WL813e_Zones.cs --entry WL813e_Zones.Arena   # 아레나 후보 재탐색
unity command run_script --file AgentScripts/WL813e_Zones.cs --entry WL813e_Zones.Watch   # Play 60 s 실측(로그인 후)
unity command run_script --file AgentScripts/WL813e_Zones.cs --entry WL813e_Zones.Result  # 결과

출력 원본 = AgentScripts/staging/WL813e/{ZONES_EDIT,ZONES_NAV,ZONES_ARENA}.txt