[WL-813t3] PD 피드백: PC 시야 3 m · 보스 평지 스폰 · 언덕 완전 차단(슬로프 30° 재베이크 · 계단 유지 · 가드 임계) (#815)
This commit is contained in:
parent
5e5db7f68f
commit
6473cdbdb9
|
|
@ -0,0 +1,20 @@
|
||||||
|
===== WL-813t2 베이크 APPLY(자산 갱신) · 2026-09-11 01:25:46 =====
|
||||||
|
현행 자산 = Assets/WL/Settings/WL_Nature_NavMesh.asset · 550144 bytes · 로드 OK
|
||||||
|
[현행(커밋본)] 삼각형 5317 · 정점 11909 · 총 면적 55621.4 m^2 · y -4.62 ~ 2.96
|
||||||
|
[현행(커밋본)] y>1.5 924.5 · y>2.0 110.6 · y>2.5 7.5 · **y>3.0 0.0** · y>3.5 0.0 · y>5.0 0.0 m^2
|
||||||
|
인스턴스 root transform pos=(0.000, 0.000, 0.000) rot=(0.0, 0.0, 0.0) scale=(1.000, 1.000, 1.000)
|
||||||
|
NavMeshModifierVolume 1개
|
||||||
|
[0] WL_Nature/WL813t2_HillNotWalkable · area=1(Not Walkable) · center(world)=(115.0, 24.0, 10.0) size=(260.0, 42.0, 260.0) · Y[3.00, 45.00] · active=True enabled=True · affectsAgent0=True layer=0
|
||||||
|
베이크 0.1 s · 결과 OK
|
||||||
|
[재베이크] 삼각형 5604 · 정점 12632 · 총 면적 57852.7 m^2 · y -3.04 ~ 2.96
|
||||||
|
[재베이크] y>1.5 1572.9 · y>2.0 322.4 · y>2.5 35.3 · **y>3.0 0.0** · y>3.5 0.0 · y>5.0 0.0 m^2
|
||||||
|
[재베이크] 시작→스포너 23 : PathComplete 23 · Partial/Invalid 0 · 밖 0
|
||||||
|
[재베이크] 아레나 (139.0, 0.8, -20.0) → (139.00, 0.81, -20.00) · 시작→아레나 PathComplete
|
||||||
|
[재베이크] 아레나 원주 12점 → 중심 PathComplete 8/12
|
||||||
|
[재베이크] 앵커 Portal_Start (115.00, 0.00, 9.98) → (115.00, 0.11, 9.98)
|
||||||
|
[재베이크] 앵커 Reincarnation_Start (115.00, 0.00, 9.98) → (115.00, 0.11, 9.98)
|
||||||
|
[재베이크] 스폰 표집 1000점 · **y>3.0 0** · NavMesh 밖 0 · 원점 폴백 0
|
||||||
|
y 분포: [-3]=1 [-2]=54 [-1]=70 [0]=700 [1]=94 [2]=81
|
||||||
|
자산 저장 완료 · 550144 → 602396 bytes (52252)
|
||||||
|
GUID = ef300913c80dbda47b476b9261fdd786 (기대 ef300913c80dbda47b476b9261fdd786)
|
||||||
|
씬 정리 완료(저장 0) · scene=
|
||||||
|
|
@ -0,0 +1,91 @@
|
||||||
|
===== WL-813t3 실측 후(슬로프 30 · 재베이크) · 2026-09-11 01:29:53 =====
|
||||||
|
|
||||||
|
── ① 시야·추적 경로 (표 1) ──────────────────────────────────────────
|
||||||
|
table_GlobalValue 미로드(NullReferenceException) — JSON 직접 읽기로 대체
|
||||||
|
원본 탐색 거리 table_GlobalValue.f_PC_FindEnemyRange = 6.00 m (+ AttackRange_Up)
|
||||||
|
원본 펫 탐색 거리 f_Pet_FindEnemyRange = 5.00 m (PC 무관)
|
||||||
|
WLTargetingSettings 실값 — retargetSearchRange 3 · chaseRange 3 · chaseDropIgnoresLock False · stopChaseMoveOnDrop True · chaseCheckSeconds 0.1 · frontConeDeg 90 · immediateAttackMargin 0.2 · autoEngage True · pcAggroOnHit False
|
||||||
|
WLRunGuideSettings 실값 — bossLockTarget False · bossHoldRadius 14 · bossPriorityEnabled True · eliteLockTarget True · eliteTargetRadius 3 · guideLeashRadius 14 · zoneArriveRadius 6 · zoneHoldRadius 18
|
||||||
|
WLBossArenaSettings 실값 — bossChaseRange 20(MonsterList 10006 f_BaseChaseRange 를 등장 시 덮어쓴다) · arenaRadius 20 · useFieldBossPositionAsCenter False · arenaCenter (139.00, 0.80, -20.00)
|
||||||
|
스킬 자동 타깃 — Actor.cs:718 `if (!isTarget) Set_Target(true)` = forcefind → MyActor.cs:126 `float.MaxValue`(무제한).
|
||||||
|
· 자동 전투 경로는 여기 안 온다 — PCActor.cs:93 이 이미 `isTarget && dist <= f_SkillRange` 를 요구한다(실측).
|
||||||
|
· 수동 스킬 버튼만 이 경로다 → 「스킬 사거리 유지」(발주서 제안) = 무변경.
|
||||||
|
Actor.cs:187 `Get_EnemyActors(…, 100f)` — OnDestroy 에서 주변 적의 타깃 참조를 끊는 **정리 경로**(ForceDel). 시야와 무관(실측).
|
||||||
|
ProjectileBase.cs:348 `Get_NearstEnemy(20 m)` · :301 `Check_TargetBoss(8 m)` — 발사체가 표적을 잃었을 때의 보정. 시야와 무관(무변경).
|
||||||
|
|
||||||
|
[3 m 과 적 사거리 대조 — 실측]
|
||||||
|
PC 공격 사거리(ClassConfig f_AttackRange · 10501) = 1.50 m → MyActor 정지거리 = 그 값 + AttackRange_Up(+ 여유 0.2)
|
||||||
|
몹 101(None) f_BaseATKRange 2.00 m · f_BaseChaseRange 30 m
|
||||||
|
몹 102(None) f_BaseATKRange 4.00 m · f_BaseChaseRange 30 m 🔴 PC 시야 3 m 보다 길다
|
||||||
|
몹 103(None) f_BaseATKRange 2.00 m · f_BaseChaseRange 30 m
|
||||||
|
몹 104(None) f_BaseATKRange 4.00 m · f_BaseChaseRange 30 m 🔴 PC 시야 3 m 보다 길다
|
||||||
|
몹 118(None) f_BaseATKRange 2.00 m · f_BaseChaseRange 15 m
|
||||||
|
몹 168(None) f_BaseATKRange 2.00 m · f_BaseChaseRange 15 m
|
||||||
|
몹 173(None) f_BaseATKRange 2.00 m · f_BaseChaseRange 15 m
|
||||||
|
몹 1023(Elite) f_BaseATKRange 2.50 m · f_BaseChaseRange 15 m
|
||||||
|
몹 10006(Boss) f_BaseATKRange 3.50 m · f_BaseChaseRange 50 m 🔴 PC 시야 3 m 보다 길다
|
||||||
|
→ 🔴 사거리가 3 m 를 넘는 적(102·104 4 m · 10006 보스 3.5 m)은 **PC 시야 밖에서 때릴 수 있다**. Lead/PD 결정 대상.
|
||||||
|
NavMesh 자산 Assets/WL/Settings/WL_Nature_NavMesh.asset · 602396 bytes · GUID ef300913c80dbda47b476b9261fdd786
|
||||||
|
Agent0(Humanoid) 실측 — radius 0.5 · height 2 · **slope 30** · climb 0.75 · minRegionArea 2 · voxel 0.16667
|
||||||
|
|
||||||
|
── ② 보스 스폰 지점 (표 2) ──────────────────────────────────────────
|
||||||
|
FieldBossData 1기
|
||||||
|
spawnerId 813010 monsterId 10006 · 노드 (139.00, 0.80, -20.00) → NavMesh (139.00, 0.81, -20.00) (Δ0.01 m)
|
||||||
|
SO arenaCenter = (139.00, 0.80, -20.00) · useFieldBossPositionAsCenter = False
|
||||||
|
813t2 y 컷(maxWalkableY) = 3.50 m
|
||||||
|
[평탄도] 아레나 중심 (139.00, 0.80, -20.00) · 반경 6 m · 격자 113점
|
||||||
|
지면 y 0.24 ~ 5.21 (Δ 4.97 m) · 경사 평균 19.7° 최대 67.0° · 30° 초과 29점 · 지면 없음 0
|
||||||
|
NavMesh 위 113/113 · y 0.33 ~ 1.57 · y 컷 초과 0
|
||||||
|
[평탄도] 보스 스포너 노드 (139.00, 0.80, -20.00) · 반경 6 m · 격자 113점
|
||||||
|
지면 y 0.24 ~ 5.21 (Δ 4.97 m) · 경사 평균 19.7° 최대 67.0° · 30° 초과 29점 · 지면 없음 0
|
||||||
|
NavMesh 위 113/113 · y 0.33 ~ 1.57 · y 컷 초과 0
|
||||||
|
참고(813t2 실측) D-48 현장 = PC 가 올라갔던 언덕 (139, 3.66, -20) · (139, 5.48, -20) · (128, 8, -58) · (147, 6, 30)
|
||||||
|
언덕 (139.00, 3.66, -20.00) → NavMesh 밖(1 m)
|
||||||
|
언덕 (139.00, 5.48, -20.00) → NavMesh 밖(1 m)
|
||||||
|
언덕 (128.00, 8.00, -58.00) → NavMesh 밖(1 m)
|
||||||
|
언덕 (147.00, 6.00, 30.00) → NavMesh 밖(1 m)
|
||||||
|
|
||||||
|
── ②b 아레나 주변 평지 후보 탐색 (중심 139/-20 · ±20 m · 2 m 격자 · 각 후보 반경 6 m 평가) ──
|
||||||
|
평가한 후보 441개
|
||||||
|
중심 부근 (137.00, 0.93, -22.00) · 지면 Δy 6.13 m · 최대경사 67.0° · NavMesh 29/29 · 점수 18.96
|
||||||
|
중심 부근 (137.01, 0.90, -19.17) · 지면 Δy 4.41 m · 최대경사 57.3° · NavMesh 29/29 · 점수 14.54
|
||||||
|
중심 부근 (137.00, 0.87, -18.00) · 지면 Δy 4.05 m · 최대경사 67.0° · NavMesh 29/29 · 점수 14.79
|
||||||
|
중심 부근 (138.33, 0.76, -22.71) · 지면 Δy 7.12 m · 최대경사 57.3° · NavMesh 29/29 · 점수 19.97
|
||||||
|
중심 부근 (139.00, 0.81, -20.00) · 지면 Δy 4.97 m · 최대경사 67.0° · NavMesh 29/29 · 점수 16.63
|
||||||
|
중심 부근 (139.00, 0.71, -18.00) · 지면 Δy 3.99 m · 최대경사 67.0° · NavMesh 29/29 · 점수 14.68
|
||||||
|
중심 부근 (141.12, 0.80, -21.74) · 지면 Δy 5.43 m · 최대경사 67.0° · NavMesh 29/29 · 점수 17.56
|
||||||
|
중심 부근 (141.00, 0.66, -20.00) · 지면 Δy 4.41 m · 최대경사 67.0° · NavMesh 29/29 · 점수 15.52
|
||||||
|
중심 부근 (141.00, 0.55, -18.00) · 지면 Δy 3.83 m · 최대경사 67.0° · NavMesh 29/29 · 점수 14.36
|
||||||
|
**가장 평평한 후보(±20 m) = (157.00, 0.04, 0.00) · 지면 Δy 0.12 m · 최대경사 3.3° · NavMesh 29/29 · 점수 0.57** (아레나 중심에서 26.9 m)
|
||||||
|
|
||||||
|
[넓은 평지 후보 — 반경 20 m 전체 평가 · ±60 m · 4 m 격자]
|
||||||
|
후보(NavMesh 90 % 이상) 831개 · 상위 8
|
||||||
|
| 중심 | 지면 Δy | 최대경사 | 30° 초과 | NavMesh | NavMesh Δy | 아레나에서 |
|
||||||
|
| (179.00, 0.01, 4.00) | 0.47 m | 8.9° | 0/81 | 81/81 | 0.90 m | 46.7 m |
|
||||||
|
| (179.00, -0.05, 8.00) | 0.63 m | 10.0° | 0/81 | 81/81 | 0.90 m | 48.8 m |
|
||||||
|
| (175.00, 0.07, 4.00) | 0.67 m | 8.9° | 0/81 | 81/81 | 0.90 m | 43.3 m |
|
||||||
|
| (187.00, -0.12, 16.00) | 0.73 m | 10.0° | 0/81 | 73/81 | 0.74 m | 60.0 m |
|
||||||
|
| (183.00, -0.07, 16.00) | 0.82 m | 10.0° | 0/81 | 80/81 | 0.84 m | 56.9 m |
|
||||||
|
| (179.00, -0.16, 12.00) | 0.85 m | 10.0° | 0/81 | 81/81 | 0.84 m | 51.2 m |
|
||||||
|
| (187.00, -0.17, 20.00) | 0.99 m | 10.0° | 0/81 | 73/81 | 0.90 m | 62.5 m |
|
||||||
|
| (175.00, -0.03, 8.00) | 1.00 m | 10.0° | 0/81 | 81/81 | 1.00 m | 45.6 m |
|
||||||
|
(현재 아레나) (139.00, 0.81, -20.00) · 지면 Δy 15.58 m · 최대경사 84.1° · 30° 초과 23/81 · 순위 733/831
|
||||||
|
|
||||||
|
── ③ 언덕 격자 1000점 (표 3 · 813t2 D-48 클러스터 X[96,160] Z[-100,-16]) ──
|
||||||
|
격자 1000점 · 지면 없음 0
|
||||||
|
지면 y 대역 — [0,1) 375 · [1,3) 184 · y>=3 441
|
||||||
|
지면 경사 30° 초과 254점 · 지면 y>3 441점
|
||||||
|
**walkable 스냅(1 m) 498점** · 그 중 y>3 1 · 경사 30° 초과 지점 34
|
||||||
|
walkable 최고 y = 2.79
|
||||||
|
**언덕 옆면(지면 y 0~3 · 경사 30° 초과) 94점 · walkable(느슨 1 m) 34 · **walkable(엄격 0.35 m) 18**` · 느슨 walkable 중 최대 경사 67.0°
|
||||||
|
**언덕 위(지면 y>3) 441점 · walkable(엄격) 0**
|
||||||
|
|
||||||
|
── ③b 계단·경사로 (표 4) ────────────────────────────────────────────
|
||||||
|
🔴 이름에 stair/step/ramp/계단 이 든 노드 **0개** — WL_Nature 에 명시적 계단 프리팹은 없다(실측).
|
||||||
|
|
||||||
|
── ③c 경로 연결성 ───────────────────────────────────────────────────
|
||||||
|
시작 (115.00, 0.00, 9.98) → 스냅 (115.00, 0.11, 9.98)
|
||||||
|
**시작 → 스포너 23기 : PathComplete 23 · Partial/Invalid 0 · NavMesh 밖 0**
|
||||||
|
시작 → 아레나 (139.00, 0.80, -20.00) 스냅 (139.00, 0.81, -20.00) = **PathComplete**
|
||||||
|
아레나 원주 12점 → 중심 PathComplete 8/12
|
||||||
|
씬 정리 완료(저장 0) · scene=
|
||||||
|
|
@ -0,0 +1,91 @@
|
||||||
|
===== WL-813t3 실측 전(슬로프 45 · 커밋본) · 2026-09-11 01:24:49 =====
|
||||||
|
|
||||||
|
── ① 시야·추적 경로 (표 1) ──────────────────────────────────────────
|
||||||
|
table_GlobalValue 미로드(NullReferenceException) — JSON 직접 읽기로 대체
|
||||||
|
원본 탐색 거리 table_GlobalValue.f_PC_FindEnemyRange = 6.00 m (+ AttackRange_Up)
|
||||||
|
원본 펫 탐색 거리 f_Pet_FindEnemyRange = 5.00 m (PC 무관)
|
||||||
|
WLTargetingSettings 실값 — retargetSearchRange 3 · chaseRange 3 · chaseDropIgnoresLock False · stopChaseMoveOnDrop True · chaseCheckSeconds 0.1 · frontConeDeg 90 · immediateAttackMargin 0.2 · autoEngage True · pcAggroOnHit False
|
||||||
|
WLRunGuideSettings 실값 — bossLockTarget False · bossHoldRadius 14 · bossPriorityEnabled True · eliteLockTarget True · eliteTargetRadius 3 · guideLeashRadius 14 · zoneArriveRadius 6 · zoneHoldRadius 18
|
||||||
|
WLBossArenaSettings 실값 — bossChaseRange 20(MonsterList 10006 f_BaseChaseRange 를 등장 시 덮어쓴다) · arenaRadius 20 · useFieldBossPositionAsCenter False · arenaCenter (139.00, 0.80, -20.00)
|
||||||
|
스킬 자동 타깃 — Actor.cs:718 `if (!isTarget) Set_Target(true)` = forcefind → MyActor.cs:126 `float.MaxValue`(무제한).
|
||||||
|
· 자동 전투 경로는 여기 안 온다 — PCActor.cs:93 이 이미 `isTarget && dist <= f_SkillRange` 를 요구한다(실측).
|
||||||
|
· 수동 스킬 버튼만 이 경로다 → 「스킬 사거리 유지」(발주서 제안) = 무변경.
|
||||||
|
Actor.cs:187 `Get_EnemyActors(…, 100f)` — OnDestroy 에서 주변 적의 타깃 참조를 끊는 **정리 경로**(ForceDel). 시야와 무관(실측).
|
||||||
|
ProjectileBase.cs:348 `Get_NearstEnemy(20 m)` · :301 `Check_TargetBoss(8 m)` — 발사체가 표적을 잃었을 때의 보정. 시야와 무관(무변경).
|
||||||
|
|
||||||
|
[3 m 과 적 사거리 대조 — 실측]
|
||||||
|
PC 공격 사거리(ClassConfig f_AttackRange · 10501) = 1.50 m → MyActor 정지거리 = 그 값 + AttackRange_Up(+ 여유 0.2)
|
||||||
|
몹 101(None) f_BaseATKRange 2.00 m · f_BaseChaseRange 30 m
|
||||||
|
몹 102(None) f_BaseATKRange 4.00 m · f_BaseChaseRange 30 m 🔴 PC 시야 3 m 보다 길다
|
||||||
|
몹 103(None) f_BaseATKRange 2.00 m · f_BaseChaseRange 30 m
|
||||||
|
몹 104(None) f_BaseATKRange 4.00 m · f_BaseChaseRange 30 m 🔴 PC 시야 3 m 보다 길다
|
||||||
|
몹 118(None) f_BaseATKRange 2.00 m · f_BaseChaseRange 15 m
|
||||||
|
몹 168(None) f_BaseATKRange 2.00 m · f_BaseChaseRange 15 m
|
||||||
|
몹 173(None) f_BaseATKRange 2.00 m · f_BaseChaseRange 15 m
|
||||||
|
몹 1023(Elite) f_BaseATKRange 2.50 m · f_BaseChaseRange 15 m
|
||||||
|
몹 10006(Boss) f_BaseATKRange 3.50 m · f_BaseChaseRange 50 m 🔴 PC 시야 3 m 보다 길다
|
||||||
|
→ 🔴 사거리가 3 m 를 넘는 적(102·104 4 m · 10006 보스 3.5 m)은 **PC 시야 밖에서 때릴 수 있다**. Lead/PD 결정 대상.
|
||||||
|
NavMesh 자산 Assets/WL/Settings/WL_Nature_NavMesh.asset · 593864 bytes · GUID ef300913c80dbda47b476b9261fdd786
|
||||||
|
Agent0(Humanoid) 실측 — radius 0.5 · height 2 · **slope 30** · climb 0.75 · minRegionArea 2 · voxel 0.16667
|
||||||
|
|
||||||
|
── ② 보스 스폰 지점 (표 2) ──────────────────────────────────────────
|
||||||
|
FieldBossData 1기
|
||||||
|
spawnerId 813010 monsterId 10006 · 노드 (139.00, 0.80, -20.00) → NavMesh (139.00, 0.81, -20.00) (Δ0.01 m)
|
||||||
|
SO arenaCenter = (139.00, 0.80, -20.00) · useFieldBossPositionAsCenter = False
|
||||||
|
813t2 y 컷(maxWalkableY) = 3.50 m
|
||||||
|
[평탄도] 아레나 중심 (139.00, 0.80, -20.00) · 반경 6 m · 격자 113점
|
||||||
|
지면 y 0.24 ~ 5.21 (Δ 4.97 m) · 경사 평균 19.7° 최대 67.0° · 30° 초과 29점 · 지면 없음 0
|
||||||
|
NavMesh 위 113/113 · y 0.33 ~ 1.98 · y 컷 초과 0
|
||||||
|
[평탄도] 보스 스포너 노드 (139.00, 0.80, -20.00) · 반경 6 m · 격자 113점
|
||||||
|
지면 y 0.24 ~ 5.21 (Δ 4.97 m) · 경사 평균 19.7° 최대 67.0° · 30° 초과 29점 · 지면 없음 0
|
||||||
|
NavMesh 위 113/113 · y 0.33 ~ 1.98 · y 컷 초과 0
|
||||||
|
참고(813t2 실측) D-48 현장 = PC 가 올라갔던 언덕 (139, 3.66, -20) · (139, 5.48, -20) · (128, 8, -58) · (147, 6, 30)
|
||||||
|
언덕 (139.00, 3.66, -20.00) → NavMesh 밖(1 m)
|
||||||
|
언덕 (139.00, 5.48, -20.00) → NavMesh 밖(1 m)
|
||||||
|
언덕 (128.00, 8.00, -58.00) → NavMesh 밖(1 m)
|
||||||
|
언덕 (147.00, 6.00, 30.00) → NavMesh 밖(1 m)
|
||||||
|
|
||||||
|
── ②b 아레나 주변 평지 후보 탐색 (중심 139/-20 · ±20 m · 2 m 격자 · 각 후보 반경 6 m 평가) ──
|
||||||
|
평가한 후보 441개
|
||||||
|
중심 부근 (137.00, 0.93, -22.00) · 지면 Δy 6.13 m · 최대경사 67.0° · NavMesh 29/29 · 점수 18.96
|
||||||
|
중심 부근 (137.01, 0.87, -19.17) · 지면 Δy 4.41 m · 최대경사 57.3° · NavMesh 29/29 · 점수 14.54
|
||||||
|
중심 부근 (137.00, 0.88, -18.00) · 지면 Δy 4.05 m · 최대경사 67.0° · NavMesh 29/29 · 점수 14.79
|
||||||
|
중심 부근 (138.33, 0.76, -22.71) · 지면 Δy 7.12 m · 최대경사 57.3° · NavMesh 29/29 · 점수 19.97
|
||||||
|
중심 부근 (139.00, 0.81, -20.00) · 지면 Δy 4.97 m · 최대경사 67.0° · NavMesh 29/29 · 점수 16.63
|
||||||
|
중심 부근 (139.00, 0.71, -18.00) · 지면 Δy 3.99 m · 최대경사 67.0° · NavMesh 29/29 · 점수 14.68
|
||||||
|
중심 부근 (141.12, 0.80, -21.74) · 지면 Δy 5.43 m · 최대경사 67.0° · NavMesh 29/29 · 점수 17.56
|
||||||
|
중심 부근 (141.00, 0.66, -20.00) · 지면 Δy 4.41 m · 최대경사 67.0° · NavMesh 29/29 · 점수 15.52
|
||||||
|
중심 부근 (141.00, 0.55, -18.00) · 지면 Δy 3.83 m · 최대경사 67.0° · NavMesh 29/29 · 점수 14.36
|
||||||
|
**가장 평평한 후보(±20 m) = (157.00, 0.04, 0.00) · 지면 Δy 0.12 m · 최대경사 3.3° · NavMesh 29/29 · 점수 0.57** (아레나 중심에서 26.9 m)
|
||||||
|
|
||||||
|
[넓은 평지 후보 — 반경 20 m 전체 평가 · ±60 m · 4 m 격자]
|
||||||
|
후보(NavMesh 90 % 이상) 851개 · 상위 8
|
||||||
|
| 중심 | 지면 Δy | 최대경사 | 30° 초과 | NavMesh | NavMesh Δy | 아레나에서 |
|
||||||
|
| (179.00, 0.01, 4.00) | 0.47 m | 8.9° | 0/81 | 81/81 | 0.90 m | 46.7 m |
|
||||||
|
| (179.00, -0.05, 8.00) | 0.63 m | 10.0° | 0/81 | 81/81 | 0.90 m | 48.8 m |
|
||||||
|
| (175.00, 0.07, 4.00) | 0.67 m | 8.9° | 0/81 | 81/81 | 0.90 m | 43.3 m |
|
||||||
|
| (187.00, -0.12, 16.00) | 0.73 m | 10.0° | 0/81 | 73/81 | 0.74 m | 60.0 m |
|
||||||
|
| (183.00, -0.07, 16.00) | 0.82 m | 10.0° | 0/81 | 80/81 | 0.84 m | 56.9 m |
|
||||||
|
| (179.00, -0.16, 12.00) | 0.85 m | 10.0° | 0/81 | 81/81 | 0.84 m | 51.2 m |
|
||||||
|
| (187.00, -0.17, 20.00) | 0.99 m | 10.0° | 0/81 | 73/81 | 0.90 m | 62.5 m |
|
||||||
|
| (175.00, -0.03, 8.00) | 1.00 m | 10.0° | 0/81 | 81/81 | 1.00 m | 45.6 m |
|
||||||
|
(현재 아레나) (139.00, 0.81, -20.00) · 지면 Δy 15.58 m · 최대경사 84.1° · 30° 초과 23/81 · 순위 746/851
|
||||||
|
|
||||||
|
── ③ 언덕 격자 1000점 (표 3 · 813t2 D-48 클러스터 X[96,160] Z[-100,-16]) ──
|
||||||
|
격자 1000점 · 지면 없음 0
|
||||||
|
지면 y 대역 — [0,1) 375 · [1,3) 184 · y>=3 441
|
||||||
|
지면 경사 30° 초과 254점 · 지면 y>3 441점
|
||||||
|
**walkable 스냅(1 m) 521점** · 그 중 y>3 4 · 경사 30° 초과 지점 54
|
||||||
|
walkable 최고 y = 2.83
|
||||||
|
**언덕 옆면(지면 y 0~3 · 경사 30° 초과) 94점 · walkable(느슨 1 m) 53 · **walkable(엄격 0.35 m) 33**` · 느슨 walkable 중 최대 경사 67.0°
|
||||||
|
**언덕 위(지면 y>3) 441점 · walkable(엄격) 0**
|
||||||
|
|
||||||
|
── ③b 계단·경사로 (표 4) ────────────────────────────────────────────
|
||||||
|
🔴 이름에 stair/step/ramp/계단 이 든 노드 **0개** — WL_Nature 에 명시적 계단 프리팹은 없다(실측).
|
||||||
|
|
||||||
|
── ③c 경로 연결성 ───────────────────────────────────────────────────
|
||||||
|
시작 (115.00, 0.00, 9.98) → 스냅 (115.00, 0.11, 9.98)
|
||||||
|
**시작 → 스포너 23기 : PathComplete 23 · Partial/Invalid 0 · NavMesh 밖 0**
|
||||||
|
시작 → 아레나 (139.00, 0.80, -20.00) 스냅 (139.00, 0.81, -20.00) = **PathComplete**
|
||||||
|
아레나 원주 12점 → 중심 PathComplete 8/12
|
||||||
|
씬 정리 완료(저장 0) · scene=
|
||||||
|
|
@ -123,6 +123,71 @@ public static class WL813t3_Measure
|
||||||
L(" · 수동 스킬 버튼만 이 경로다 → 「스킬 사거리 유지」(발주서 제안) = 무변경.");
|
L(" · 수동 스킬 버튼만 이 경로다 → 「스킬 사거리 유지」(발주서 제안) = 무변경.");
|
||||||
L(" Actor.cs:187 `Get_EnemyActors(…, 100f)` — OnDestroy 에서 주변 적의 타깃 참조를 끊는 **정리 경로**(ForceDel). 시야와 무관(실측).");
|
L(" Actor.cs:187 `Get_EnemyActors(…, 100f)` — OnDestroy 에서 주변 적의 타깃 참조를 끊는 **정리 경로**(ForceDel). 시야와 무관(실측).");
|
||||||
L(" ProjectileBase.cs:348 `Get_NearstEnemy(20 m)` · :301 `Check_TargetBoss(8 m)` — 발사체가 표적을 잃었을 때의 보정. 시야와 무관(무변경).");
|
L(" ProjectileBase.cs:348 `Get_NearstEnemy(20 m)` · :301 `Check_TargetBoss(8 m)` — 발사체가 표적을 잃었을 때의 보정. 시야와 무관(무변경).");
|
||||||
|
|
||||||
|
// 3 m 가 적 사거리보다 짧은지 — 실측
|
||||||
|
L("");
|
||||||
|
L(" [3 m 과 적 사거리 대조 — 실측]");
|
||||||
|
L(" PC 공격 사거리(ClassConfig f_AttackRange · 10501) = " + ReadClassAttackRange(10501).ToString("F2")
|
||||||
|
+ " m → MyActor 정지거리 = 그 값 + AttackRange_Up(+ 여유 " + (t != null ? t.immediateAttackMargin : 0.2f) + ")");
|
||||||
|
int[] mobs = { 101, 102, 103, 104, 118, 168, 173, 1023, 10006 };
|
||||||
|
for (int i = 0; i < mobs.Length; i++)
|
||||||
|
{
|
||||||
|
float atk, chase; string type;
|
||||||
|
if (!ReadMonster(mobs[i], out atk, out chase, out type)) continue;
|
||||||
|
L(" 몹 " + mobs[i] + "(" + type + ") f_BaseATKRange " + atk.ToString("F2") + " m · f_BaseChaseRange " + chase.ToString("F0") + " m"
|
||||||
|
+ (atk > 3f ? " 🔴 PC 시야 3 m 보다 길다" : ""));
|
||||||
|
}
|
||||||
|
L(" → 🔴 사거리가 3 m 를 넘는 적(102·104 4 m · 10006 보스 3.5 m)은 **PC 시야 밖에서 때릴 수 있다**. Lead/PD 결정 대상.");
|
||||||
|
}
|
||||||
|
|
||||||
|
static float ReadClassAttackRange(int classId)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string txt = System.IO.File.ReadAllText(Abs("Assets/ResWork/Table/Export/ClassConfig.json"));
|
||||||
|
int i = txt.IndexOf("\"n_ClassID\": \"" + classId + "\"");
|
||||||
|
if (i < 0) return -1f;
|
||||||
|
int j = txt.IndexOf("\"f_AttackRange\": \"", i);
|
||||||
|
if (j < 0) return -1f;
|
||||||
|
j += 18;
|
||||||
|
int k = txt.IndexOf('"', j);
|
||||||
|
float v;
|
||||||
|
if (float.TryParse(txt.Substring(j, k - j), System.Globalization.NumberStyles.Float,
|
||||||
|
System.Globalization.CultureInfo.InvariantCulture, out v)) return v;
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
return -1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ReadMonster(int id, out float atkRange, out float chaseRange, out string type)
|
||||||
|
{
|
||||||
|
atkRange = chaseRange = -1f; type = "?";
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string txt = System.IO.File.ReadAllText(Abs("Assets/ResWork/Table/Export/MonsterList.json"));
|
||||||
|
int i = txt.IndexOf("\"n_MonsterID\": \"" + id + "\"");
|
||||||
|
if (i < 0) return false;
|
||||||
|
int end = txt.IndexOf('}', i); if (end < 0) end = txt.Length;
|
||||||
|
string row = txt.Substring(i, end - i);
|
||||||
|
atkRange = Field(row, "f_BaseATKRange");
|
||||||
|
chaseRange = Field(row, "f_BaseChaseRange");
|
||||||
|
int t = row.IndexOf("\"e_MonsterType\": \"");
|
||||||
|
if (t >= 0) { t += 18; int u = row.IndexOf('"', t); type = row.Substring(t, u - t); }
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch { return false; }
|
||||||
|
}
|
||||||
|
|
||||||
|
static float Field(string row, string key)
|
||||||
|
{
|
||||||
|
int j = row.IndexOf("\"" + key + "\": \"");
|
||||||
|
if (j < 0) return -1f;
|
||||||
|
j += key.Length + 5;
|
||||||
|
int k = row.IndexOf('"', j);
|
||||||
|
float v;
|
||||||
|
if (float.TryParse(row.Substring(j, k - j), System.Globalization.NumberStyles.Float,
|
||||||
|
System.Globalization.CultureInfo.InvariantCulture, out v)) return v;
|
||||||
|
return -1f;
|
||||||
}
|
}
|
||||||
|
|
||||||
static float ReadGlobalValueFromJson(string id)
|
static float ReadGlobalValueFromJson(string id)
|
||||||
|
|
@ -233,10 +298,67 @@ public static class WL813t3_Measure
|
||||||
}
|
}
|
||||||
L(" 평가한 후보 " + evaluated + "개");
|
L(" 평가한 후보 " + evaluated + "개");
|
||||||
for (int i = 0; i < best.Count; i++) L(best[i]);
|
for (int i = 0; i < best.Count; i++) L(best[i]);
|
||||||
L(" **가장 평평한 후보 = " + bestLine + "** (아레나 중심에서 "
|
L(" **가장 평평한 후보(±20 m) = " + bestLine + "** (아레나 중심에서 "
|
||||||
+ UnityEngine.Vector3.Distance(bestP, new UnityEngine.Vector3(139f, 0.8f, -20f)).ToString("F1") + " m)");
|
+ UnityEngine.Vector3.Distance(bestP, new UnityEngine.Vector3(139f, 0.8f, -20f)).ToString("F1") + " m)");
|
||||||
|
|
||||||
|
WideFlatSearch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>넓은 범위(±60 m · 4 m 격자)에서 「아레나 반경 20 m 가 통째로 평지인」 후보 상위 8개.</summary>
|
||||||
|
static void WideFlatSearch()
|
||||||
|
{
|
||||||
|
L("");
|
||||||
|
L(" [넓은 평지 후보 — 반경 20 m 전체 평가 · ±60 m · 4 m 격자]");
|
||||||
|
var list = new System.Collections.Generic.List<Cand>();
|
||||||
|
for (int i = -15; i <= 15; i++)
|
||||||
|
for (int j = -15; j <= 15; j++)
|
||||||
|
{
|
||||||
|
var c = new UnityEngine.Vector3(139f + i * 4f, 0.8f, -20f + j * 4f);
|
||||||
|
UnityEngine.AI.NavMeshHit ch;
|
||||||
|
if (!UnityEngine.AI.NavMesh.SamplePosition(c, out ch, 2f, UnityEngine.AI.NavMesh.AllAreas)) continue;
|
||||||
|
int n = 0, on = 0, steep = 0; float ymin = 1e9f, ymax = -1e9f, smax = 0f, myMin = 1e9f, myMax = -1e9f;
|
||||||
|
for (int a = -5; a <= 5; a++)
|
||||||
|
for (int b = -5; b <= 5; b++)
|
||||||
|
{
|
||||||
|
float dx = a * 4f, dz = b * 4f;
|
||||||
|
if (dx * dx + dz * dz > 400f) continue;
|
||||||
|
n++;
|
||||||
|
var p = new UnityEngine.Vector3(ch.position.x + dx, ch.position.y, ch.position.z + dz);
|
||||||
|
UnityEngine.RaycastHit rh;
|
||||||
|
if (UnityEngine.Physics.Raycast(new UnityEngine.Vector3(p.x, p.y + 80f, p.z), UnityEngine.Vector3.down, out rh, 240f))
|
||||||
|
{
|
||||||
|
if (rh.point.y < ymin) ymin = rh.point.y;
|
||||||
|
if (rh.point.y > ymax) ymax = rh.point.y;
|
||||||
|
float ang = UnityEngine.Vector3.Angle(rh.normal, UnityEngine.Vector3.up);
|
||||||
|
if (ang > smax) smax = ang;
|
||||||
|
if (ang > 30f) steep++;
|
||||||
|
}
|
||||||
|
UnityEngine.AI.NavMeshHit h2;
|
||||||
|
if (UnityEngine.AI.NavMesh.SamplePosition(p, out h2, 2f, UnityEngine.AI.NavMesh.AllAreas))
|
||||||
|
{ on++; if (h2.position.y < myMin) myMin = h2.position.y; if (h2.position.y > myMax) myMax = h2.position.y; }
|
||||||
|
}
|
||||||
|
if (n == 0 || on < n * 0.9f) continue; // NavMesh 가 90 % 미만이면 아레나로 못 쓴다
|
||||||
|
float span = (ymax > -1e8f) ? (ymax - ymin) : 99f;
|
||||||
|
list.Add(new Cand { p = ch.position, span = span, smax = smax, steep = steep, n = n, on = on, mySpan = myMax - myMin });
|
||||||
|
}
|
||||||
|
list.Sort(delegate (Cand a, Cand b) { return (a.span * 2f + a.steep).CompareTo(b.span * 2f + b.steep); });
|
||||||
|
L(" 후보(NavMesh 90 % 이상) " + list.Count + "개 · 상위 8");
|
||||||
|
L(" | 중심 | 지면 Δy | 최대경사 | 30° 초과 | NavMesh | NavMesh Δy | 아레나에서 |");
|
||||||
|
for (int i = 0; i < list.Count && i < 8; i++)
|
||||||
|
{
|
||||||
|
var c = list[i];
|
||||||
|
L(" | " + c.p.ToString("F2") + " | " + c.span.ToString("F2") + " m | " + c.smax.ToString("F1") + "° | "
|
||||||
|
+ c.steep + "/" + c.n + " | " + c.on + "/" + c.n + " | " + c.mySpan.ToString("F2") + " m | "
|
||||||
|
+ UnityEngine.Vector3.Distance(c.p, new UnityEngine.Vector3(139f, 0.8f, -20f)).ToString("F1") + " m |");
|
||||||
|
}
|
||||||
|
// 현재 아레나도 같은 잣대로
|
||||||
|
for (int i = 0; i < list.Count; i++)
|
||||||
|
if (UnityEngine.Vector3.Distance(list[i].p, new UnityEngine.Vector3(139f, 0.8f, -20f)) < 2.5f)
|
||||||
|
{ var c = list[i]; L(" (현재 아레나) " + c.p.ToString("F2") + " · 지면 Δy " + c.span.ToString("F2") + " m · 최대경사 " + c.smax.ToString("F1") + "° · 30° 초과 " + c.steep + "/" + c.n + " · 순위 " + (i + 1) + "/" + list.Count); break; }
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Cand { public UnityEngine.Vector3 p; public float span, smax, mySpan; public int steep, n, on; }
|
||||||
|
|
||||||
/// <summary>지점 주변 반경 r 의 평탄도 — 지면 raycast y 범위 · NavMesh 스냅 y 범위 · 경사각 분포.</summary>
|
/// <summary>지점 주변 반경 r 의 평탄도 — 지면 raycast y 범위 · NavMesh 스냅 y 범위 · 경사각 분포.</summary>
|
||||||
static void Flatness(string label, UnityEngine.Vector3 center, float cut)
|
static void Flatness(string label, UnityEngine.Vector3 center, float cut)
|
||||||
{
|
{
|
||||||
|
|
@ -320,8 +442,10 @@ public static class WL813t3_Measure
|
||||||
L(" walkable 최고 y = " + (maxWalkY > -1e8f ? maxWalkY.ToString("F2") : "없음"));
|
L(" walkable 최고 y = " + (maxWalkY > -1e8f ? maxWalkY.ToString("F2") : "없음"));
|
||||||
|
|
||||||
// 옆면(y 0~3) 전용 — 경사 30° 초과인 지점만 다시 본다
|
// 옆면(y 0~3) 전용 — 경사 30° 초과인 지점만 다시 본다
|
||||||
int sideN = 0, sideWalk = 0;
|
// 느슨(스냅 1 m · 옆 평지에 붙는 것 포함) / **엄격**(수평 0.35 m · |Δy| 0.5 m 안 = 그 지점 자체가 walkable)
|
||||||
|
int sideN = 0, sideWalkLoose = 0, sideWalkStrict = 0;
|
||||||
float sideMaxSlopeWalk = 0f;
|
float sideMaxSlopeWalk = 0f;
|
||||||
|
int hiN = 0, hiWalkStrict = 0; // 언덕 위(지면 y>3) 엄격
|
||||||
for (int i = 0; i < 32; i++)
|
for (int i = 0; i < 32; i++)
|
||||||
for (int j = 0; j < 32; j++)
|
for (int j = 0; j < 32; j++)
|
||||||
{
|
{
|
||||||
|
|
@ -330,15 +454,25 @@ public static class WL813t3_Measure
|
||||||
UnityEngine.RaycastHit rh;
|
UnityEngine.RaycastHit rh;
|
||||||
if (!UnityEngine.Physics.Raycast(new UnityEngine.Vector3(x, 120f, z), UnityEngine.Vector3.down, out rh, 400f)) continue;
|
if (!UnityEngine.Physics.Raycast(new UnityEngine.Vector3(x, 120f, z), UnityEngine.Vector3.down, out rh, 400f)) continue;
|
||||||
float gy = rh.point.y;
|
float gy = rh.point.y;
|
||||||
if (gy < 0f || gy > 3f) continue;
|
|
||||||
float ang = UnityEngine.Vector3.Angle(rh.normal, UnityEngine.Vector3.up);
|
float ang = UnityEngine.Vector3.Angle(rh.normal, UnityEngine.Vector3.up);
|
||||||
if (ang <= 30f) continue;
|
|
||||||
sideN++;
|
|
||||||
UnityEngine.AI.NavMeshHit h;
|
UnityEngine.AI.NavMeshHit h;
|
||||||
if (UnityEngine.AI.NavMesh.SamplePosition(rh.point, out h, 1f, UnityEngine.AI.NavMesh.AllAreas))
|
bool on = UnityEngine.AI.NavMesh.SamplePosition(rh.point, out h, 1f, UnityEngine.AI.NavMesh.AllAreas);
|
||||||
{ sideWalk++; if (ang > sideMaxSlopeWalk) sideMaxSlopeWalk = ang; }
|
bool strict = false;
|
||||||
|
if (on)
|
||||||
|
{
|
||||||
|
float ddx = h.position.x - rh.point.x, ddz = h.position.z - rh.point.z;
|
||||||
|
strict = UnityEngine.Mathf.Sqrt(ddx * ddx + ddz * ddz) <= 0.35f
|
||||||
|
&& UnityEngine.Mathf.Abs(h.position.y - gy) <= 0.5f;
|
||||||
}
|
}
|
||||||
L(" **언덕 옆면(지면 y 0~3 · 경사 30° 초과) " + sideN + "점 · walkable " + sideWalk + "** · walkable 중 최대 경사 " + sideMaxSlopeWalk.ToString("F1") + "°");
|
if (gy > 3f) { hiN++; if (strict) hiWalkStrict++; continue; }
|
||||||
|
if (gy < 0f || ang <= 30f) continue;
|
||||||
|
sideN++;
|
||||||
|
if (on) { sideWalkLoose++; if (ang > sideMaxSlopeWalk) sideMaxSlopeWalk = ang; }
|
||||||
|
if (strict) sideWalkStrict++;
|
||||||
|
}
|
||||||
|
L(" **언덕 옆면(지면 y 0~3 · 경사 30° 초과) " + sideN + "점 · walkable(느슨 1 m) " + sideWalkLoose
|
||||||
|
+ " · **walkable(엄격 0.35 m) " + sideWalkStrict + "**` · 느슨 walkable 중 최대 경사 " + sideMaxSlopeWalk.ToString("F1") + "°");
|
||||||
|
L(" **언덕 위(지면 y>3) " + hiN + "점 · walkable(엄격) " + hiWalkStrict + "**");
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─────────────────────────────────────────────────────────────────────────
|
// ─────────────────────────────────────────────────────────────────────────
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
===== WL-813t3 프로브 · 2026-09-11 01:27:33 =====
|
||||||
|
에디트 모드 · Play 0 · 로그인 0 · 실 에셋은 읽기만 한다.
|
||||||
|
|
||||||
|
── ⓪ 준비
|
||||||
|
[PASS] 가짜 메인 PC · MyValue.MyPC 등록
|
||||||
|
[PASS] WLTargetingSettings 에셋 로드
|
||||||
|
실값 retargetSearchRange=3 · chaseRange=3 · chaseDropIgnoresLock=False · stopChaseMoveOnDrop=True · chaseCheckSeconds=0.1
|
||||||
|
[PASS] SightRangeGuard.Active (chaseRange > 0)
|
||||||
|
PC Agent = 없음(에디트 모드 — 이동 정지 경로는 미확인)
|
||||||
|
|
||||||
|
── ① 시야 3 m 판정표 (SightRangeGuard.Decide · 순수 함수)
|
||||||
|
| 거리 | 락 | ignoreLock | 판정 |
|
||||||
|
[PASS] 0.0 m(붙어 있음) → 유지 (기대 유지)
|
||||||
|
[PASS] 2.5 m → 유지 (기대 유지)
|
||||||
|
[PASS] 3.0 m(경계 = 유지) → 유지 (기대 유지)
|
||||||
|
[PASS] 3.01 m → 놓음 (기대 놓음)
|
||||||
|
[PASS] 3.5 m → 놓음 (기대 놓음)
|
||||||
|
[PASS] 14 m(813w 보스 홀드 반경) → 놓음 (기대 놓음)
|
||||||
|
[PASS] 3.5 m · 락 · 락 존중 → 락유지 (기대 락유지)
|
||||||
|
[PASS] 3.5 m · 락 · 락 무시 → 놓음 (기대 놓음)
|
||||||
|
[PASS] chaseRange 0 = 축 off(C8) → 축off (기대 축off)
|
||||||
|
|
||||||
|
── ② 가짜 적으로 실호출 (SightRangeGuard.CheckOnce · 원본 Del_Target 경로)
|
||||||
|
[PASS] 2.5 m 적 → 타깃 유지 (거리 실측 2.50 m)
|
||||||
|
[PASS] 3.5 m 적 → **타깃 해제** (거리 실측 3.50 m · Dropped=1 · 마지막 __WL813t3_far)
|
||||||
|
[PASS] 9 m 락 보스 → 유지(원본 락 존중 · LockKept=1) · SO `bossLockTarget` 을 0 으로 두면 813w 가 애초에 락을 걸지 않는다
|
||||||
|
[PASS] chaseDropIgnoresLock=1 → 락 보스도 해제
|
||||||
|
이동 정지 경로(MoveStopped=0 · MoveSkipped=2) — 🔴 에디트 모드엔 NavMeshAgent·애니메이터가 없어 **실이동 정지는 미확인**(§QA 로 확인).
|
||||||
|
|
||||||
|
── ③ 보스 평지 스폰 (SpawnPositionGuard.ResolveBossPin · 순수 함수)
|
||||||
|
[PASS] WLTerrainGuardSettings 에셋 로드
|
||||||
|
실값 bossSpawnPinEnabled=True · bossSpawnPinRadius=6 · bossSpawnPinTolerance=1 · maxWalkableY=3.5 · dwellSeconds=0.5
|
||||||
|
BossArena.Center(에디트 모드 · 보류 목록 비어 있음 → SO arenaCenter) = (139.00, 0.80, -20.00)
|
||||||
|
[PASS] WL_Nature_NavMesh.asset 로드·부착(삼각형 5604)
|
||||||
|
[PASS] 언덕 위 가짜 보스 (139, 6.00, -20) → **옮김** (139.00, 0.81, -20.00) · y 컷(3.5) 이하 True
|
||||||
|
[PASS] 아레나 제자리 (139.00, 0.80, -20.00) → 이미 제자리 (139.00, 0.81, -20.00)
|
||||||
|
[PASS] D-48 언덕 (128, 8.00, -58) → **옮김** (139.00, 0.81, -20.00)
|
||||||
|
[PASS] D-48 언덕 (147, 6.00, 30) → **옮김** (139.00, 0.81, -20.00)
|
||||||
|
[PASS] C8: bossSpawnPinEnabled=0 → 손대지 않음(앵커없음(무개입))
|
||||||
|
|
||||||
|
── ④ C8 진리표 (값 원복 = 813t2 동작)
|
||||||
|
[PASS] chaseRange=0 → Active=false · 3.5 m 적 유지(= 813t3 이전 동작 100%)
|
||||||
|
[PASS] RuntimeDisabled=true → Active=false
|
||||||
|
[PASS] retargetSearchRange=0 → MyActor.Get_WLFindRange() 가 원본 f_FindEnemyRange(table 6 m + AttackRange_Up)로 되돌아간다
|
||||||
|
[PASS] WLTerrainGuardSettings.enabled=0 → 813t2 러너·스폰 보정 전부 off(보스 고정 포함)
|
||||||
|
[PASS] 실 에셋 복구 확인(프로브가 실 에셋을 쓰지 않았다)
|
||||||
|
[PASS] WLBossArenaSettings.useFieldBossPositionAsCenter=0 → 아레나 중심이 **SO 값**(139, 0.8, -20)으로 고정 (1 로 되돌리면 스포너 노드 위치)
|
||||||
|
[PASS] WLRunGuideSettings.bossLockTarget=0 → 813w 보스 락타깃 off(1 로 되돌리면 원상)
|
||||||
|
|
||||||
|
── ⑤ GC (틱 · 판정 반복)
|
||||||
|
[PASS] CheckOnce ×1000 + ResolveBossPin ×1000 + Decide ×1000 → Δ 0 B
|
||||||
|
|
||||||
|
RESULT PASS
|
||||||
|
|
@ -221,16 +221,25 @@ public static class WL813t3_Probe
|
||||||
|
|
||||||
var arena = WL.Combat.Boss.BossArena.Center;
|
var arena = WL.Combat.Boss.BossArena.Center;
|
||||||
L(" BossArena.Center(에디트 모드 · 보류 목록 비어 있음 → SO arenaCenter) = " + V(arena));
|
L(" BossArena.Center(에디트 모드 · 보류 목록 비어 있음 → SO arenaCenter) = " + V(arena));
|
||||||
bool navUp = UnityEngine.AI.NavMesh.CalculateTriangulation().vertices.Length > 0;
|
|
||||||
L(" 씬에 NavMesh 올라와 있음 = " + navUp + (navUp ? "" : " → 아래 표집 결과는 「NavMesh 없음」이 정상(측정은 WL813t3_Measure 가 한다)"));
|
|
||||||
|
|
||||||
|
// 실 NavMesh 자산을 잠시 올린다(WL_Nature 재베이크본) — 표집이 실제로 돌게.
|
||||||
|
var data = UnityEditor.AssetDatabase.LoadAssetAtPath<UnityEngine.AI.NavMeshData>("Assets/WL/Settings/WL_Nature_NavMesh.asset");
|
||||||
|
UnityEngine.AI.NavMeshDataInstance inst = default(UnityEngine.AI.NavMeshDataInstance);
|
||||||
|
if (data != null) inst = UnityEngine.AI.NavMesh.AddNavMeshData(data);
|
||||||
|
L(" " + P(data != null) + " WL_Nature_NavMesh.asset 로드·부착(삼각형 "
|
||||||
|
+ (UnityEngine.AI.NavMesh.CalculateTriangulation().indices.Length / 3) + ")");
|
||||||
|
try
|
||||||
|
{
|
||||||
UnityEngine.Vector3 outp;
|
UnityEngine.Vector3 outp;
|
||||||
int r1 = WL.Combat.Nav.SpawnPositionGuard.ResolveBossPin(cfg, new UnityEngine.Vector3(139f, 6f, -20f), out outp);
|
int r1 = WL.Combat.Nav.SpawnPositionGuard.ResolveBossPin(cfg, new UnityEngine.Vector3(139f, 6f, -20f), out outp);
|
||||||
L(" 언덕 위 가짜 보스 (139, 6.00, -20) → " + PinName(r1) + " " + V(outp));
|
L(" " + P(r1 == WL.Combat.Nav.SpawnPositionGuard.BossPinMoved) + " 언덕 위 가짜 보스 (139, 6.00, -20) → " + PinName(r1) + " " + V(outp)
|
||||||
|
+ " · y 컷(" + cfg.maxWalkableY + ") 이하 " + (outp.y <= cfg.maxWalkableY));
|
||||||
int r2 = WL.Combat.Nav.SpawnPositionGuard.ResolveBossPin(cfg, arena, out outp);
|
int r2 = WL.Combat.Nav.SpawnPositionGuard.ResolveBossPin(cfg, arena, out outp);
|
||||||
L(" 아레나 제자리 " + V(arena) + " → " + PinName(r2) + " " + V(outp));
|
L(" " + P(r2 == WL.Combat.Nav.SpawnPositionGuard.BossPinAlready) + " 아레나 제자리 " + V(arena) + " → " + PinName(r2) + " " + V(outp));
|
||||||
int r3 = WL.Combat.Nav.SpawnPositionGuard.ResolveBossPin(cfg, new UnityEngine.Vector3(128f, 8f, -58f), out outp);
|
int r3 = WL.Combat.Nav.SpawnPositionGuard.ResolveBossPin(cfg, new UnityEngine.Vector3(128f, 8f, -58f), out outp);
|
||||||
L(" D-48 언덕 (128, 8.00, -58) → " + PinName(r3) + " " + V(outp));
|
L(" " + P(r3 == WL.Combat.Nav.SpawnPositionGuard.BossPinMoved) + " D-48 언덕 (128, 8.00, -58) → " + PinName(r3) + " " + V(outp));
|
||||||
|
int r5 = WL.Combat.Nav.SpawnPositionGuard.ResolveBossPin(cfg, new UnityEngine.Vector3(147f, 6f, 30f), out outp);
|
||||||
|
L(" " + P(r5 == WL.Combat.Nav.SpawnPositionGuard.BossPinMoved) + " D-48 언덕 (147, 6.00, 30) → " + PinName(r5) + " " + V(outp));
|
||||||
|
|
||||||
var off = UnityEngine.ScriptableObject.CreateInstance<WL.Combat.Nav.WLTerrainGuardSettings>();
|
var off = UnityEngine.ScriptableObject.CreateInstance<WL.Combat.Nav.WLTerrainGuardSettings>();
|
||||||
off.bossSpawnPinEnabled = false;
|
off.bossSpawnPinEnabled = false;
|
||||||
|
|
@ -238,6 +247,8 @@ public static class WL813t3_Probe
|
||||||
L(" " + P(r4 == WL.Combat.Nav.SpawnPositionGuard.BossPinNoAnchor) + " C8: bossSpawnPinEnabled=0 → 손대지 않음(" + PinName(r4) + ")");
|
L(" " + P(r4 == WL.Combat.Nav.SpawnPositionGuard.BossPinNoAnchor) + " C8: bossSpawnPinEnabled=0 → 손대지 않음(" + PinName(r4) + ")");
|
||||||
UnityEngine.Object.DestroyImmediate(off);
|
UnityEngine.Object.DestroyImmediate(off);
|
||||||
}
|
}
|
||||||
|
finally { if (inst.valid) UnityEngine.AI.NavMesh.RemoveNavMeshData(inst); }
|
||||||
|
}
|
||||||
|
|
||||||
static string PinName(int v)
|
static string PinName(int v)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -366,8 +366,11 @@ namespace WL.Combat.Nav
|
||||||
if (TerrainGuard.HeightRuleApplies(cfg) && hit.position.y > cfg.maxWalkableY) return BossPinFailed;
|
if (TerrainGuard.HeightRuleApplies(cfg) && hit.position.y > cfg.maxWalkableY) return BossPinFailed;
|
||||||
|
|
||||||
target = hit.position;
|
target = hit.position;
|
||||||
|
// 🔴 수평만 보면 「아레나 바로 위 공중/바위 위」(예: 보스 점프 착지 y 6.0)를 「제자리」로 놓친다(프로브 실측).
|
||||||
|
// 수평·수직 둘 다 여유 안이어야 제자리로 본다.
|
||||||
float dx = pos.x - target.x, dz = pos.z - target.z;
|
float dx = pos.x - target.x, dz = pos.z - target.z;
|
||||||
if (Mathf.Sqrt(dx * dx + dz * dz) <= Mathf.Max(0f, cfg.bossSpawnPinTolerance)) return BossPinAlready;
|
float tol = Mathf.Max(0f, cfg.bossSpawnPinTolerance);
|
||||||
|
if (Mathf.Sqrt(dx * dx + dz * dz) <= tol && Mathf.Abs(pos.y - target.y) <= tol) return BossPinAlready;
|
||||||
return BossPinMoved;
|
return BossPinMoved;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,8 +48,8 @@ MonoBehaviour:
|
||||||
bossHoldRadius: 14
|
bossHoldRadius: 14
|
||||||
bossLockTarget: 0
|
bossLockTarget: 0
|
||||||
elitePriorityEnabled: 1
|
elitePriorityEnabled: 1
|
||||||
eliteTargetRadius: 12
|
eliteTargetRadius: 3
|
||||||
eliteReleaseRadius: 18
|
eliteReleaseRadius: 3
|
||||||
eliteLockTarget: 1
|
eliteLockTarget: 1
|
||||||
eliteRetargetOnlyInHold: 1
|
eliteRetargetOnlyInHold: 1
|
||||||
warpBackEnabled: 1
|
warpBackEnabled: 1
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -75,7 +75,7 @@ NavMeshProjectSettings:
|
||||||
agentTypeID: 0
|
agentTypeID: 0
|
||||||
agentRadius: 0.5
|
agentRadius: 0.5
|
||||||
agentHeight: 2
|
agentHeight: 2
|
||||||
agentSlope: 45
|
agentSlope: 30
|
||||||
agentClimb: 0.75
|
agentClimb: 0.75
|
||||||
ledgeDropHeight: 0
|
ledgeDropHeight: 0
|
||||||
maxJumpAcrossDistance: 0
|
maxJumpAcrossDistance: 0
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue