BT5-Dev #98: R1 방어 영역 — 발 자체 검사·시작 위치 텔레포트 복귀

PD 강한 어조 (2026-05-08): "여전히 몬스터가 낭떠러지로 떨어져"

본 PM 17회 가설 누적 부정확 자인. R1 방어 영역 즉시 적용:

매 frame Update 영역 마지막에 발 영역 자체 절벽 검사:
- footHere = (_collider.bounds.center.x, _collider.bounds.min.y + 0.05f)
- Raycast Layer 0+16 cliffCheckDepth 영역
- groundUnder.collider == null 시 = 발 영역 자체 절벽
- 시작 위치 텔레포트 즉시 복귀:
  - transform.position + body.position 동시 set
  - control.velocity = Vector2.zero (낙하 차단)
  - patrolPhase = 0, SetNextPatrolTarget, cooldown 활성, waitTimer 1~3초

효과:
- 본 PM 알고리즘 영역 부정합 잔존 시도 = 떨어짐 검출 즉시 시작 위치 복귀
- 영구 떨어짐 X 보장 (방어 영역)
- 시작 위치 = 안전 영역 가설 (PD가 Enemy 영역 발판 위 배치)

후속 의무:
- PD Refresh+Play 시각 검증 (떨어짐 차단 정합)
This commit is contained in:
깃 관리자 2026-05-08 14:13:23 +09:00
parent e701829356
commit b3cbbdbf40
1 changed files with 22 additions and 0 deletions

View File

@ -250,6 +250,28 @@ namespace Platformer.Mechanics
// BT89 — 자동 patrol + 즉시 벽 검출 + 1~3초 대기 영역
UpdatePatrol();
// BT98 — 방어 영역 (R1·PD 강한 어조 정합): 발 영역 자체 절벽 검사 → 시작 위치 즉시 텔레포트 복귀
// 본 PM 17회 가설 누적 부정확. 알고리즘 영역 부정합 잔존 시도 안전 보장.
if (_isInitialized && _collider != null)
{
Vector2 footHere = new Vector2(_collider.bounds.center.x, _collider.bounds.min.y + 0.05f);
RaycastHit2D groundUnder = Physics2D.Raycast(footHere, Vector2.down, cliffCheckDepth, groundLayerMask);
if (groundUnder.collider == null)
{
Vector3 safe = new Vector3(_startX, transform.position.y, transform.position.z);
transform.position = safe;
if (_body != null) _body.position = safe;
if (control != null) control.velocity = Vector2.zero;
_patrolPhase = 0;
SetNextPatrolTarget();
_phaseCooldown = PHASE_COOLDOWN;
_stuckTimer = 0f;
_lastX = _startX;
_waitTimer = Random.Range(waitMinTime, waitMaxTime);
if (control != null) control.move.x = 0f;
}
}
// 이하 — Player 충돌 검출 영역 (patrol 영역과 분리)
// PD 지시 2026-05-07 — Player ↔ Enemy 통과 가능이지만 Bounds.Intersects로 매 프레임 감지