BT5-Dev #81: Enemy 벽 정지·낭떠러지 정정 (PD 2건)

PD 보고 (2026-05-08):
1. 벽에 닿은 후 멈춰있음 (이동 거리 미달 + 벽 충돌 → dx 영역 큰 값 잔존 → 영구 정지)
2. 낭떠러지 떨어짐 (절벽 검출 거짓 양성 또는 미검출)

진단:
- 버그 1: BT80 코드는 dx<arriveThreshold 시점만 다음 phase. 벽 충돌 시 KinematicObject body.Cast 차단 → transform.x 정지 → dx 영역 잔존 → phase 전환 X
- 버그 2: groundLayerMask=~0 (모든 layer) = Enemy/Player Collider 거짓 양성 → 절벽 영역 미검출

정정 (BT81):
1. stuckTimer 영역 신규:
   - _lastX·_stuckTimer 추가
   - 매 frame |transform.x - _lastX| < 0.01 시 _stuckTimer 누적
   - _stuckTimer > 0.5초 시 = 벽 정지 → 다음 phase 강제
2. groundLayerMask: ~0 → (1 << 0) | (1 << 16) — Layer 0 (지면) + Layer 16 (발판)만
3. cliffCheckDepth: 0.8 → 1.5 — 지면 검출 깊이 증가
4. Inspector 노출: stuckThresholdTime 신규 (기본 0.5초)

효과:
- 벽 정지 시 0.5초 후 자동 phase 전환 (다음 patrol 방향 시도)
- 절벽 검출 = Layer 0/16만 = Enemy/Player 거짓 양성 차단
- 시작 위치 복귀 영역 그대로

후속 의무:
- PD Refresh+Play 시각 검증
This commit is contained in:
깃 관리자 2026-05-08 11:33:57 +09:00
parent 3591bd218f
commit cbde93a66d
1 changed files with 26 additions and 2 deletions

View File

@ -27,12 +27,15 @@ namespace Platformer.Mechanics
public float patrolMaxRange = 150f;
public float patrolArriveThreshold = 0.5f;
public float cliffCheckDistance = 0.6f; // 발 앞 절벽 검출 거리
public float cliffCheckDepth = 0.8f; // 발 아래 Raycast 거리
public LayerMask groundLayerMask = ~0; // 절벽 검출용 ground layer (default = 모든 layer)
public float cliffCheckDepth = 1.5f; // 발 아래 Raycast 거리 (BT81: 0.8→1.5 — 깊게 검출)
public LayerMask groundLayerMask = (1 << 0) | (1 << 16); // BT81: Layer 0 (지면) + Layer 16 (발판) — Enemy/Player 거짓 양성 차단
public float stuckThresholdTime = 0.5f; // 벽 정지 검출 시간 (BT81)
private float _startX;
private float _targetX;
private int _patrolPhase; // 0: right out / 1: right back / 2: left out / 3: left back
private float _lastX; // BT81: 벽 정지 검출용
private float _stuckTimer; // BT81: 벽 정지 누적 시간
internal PatrolPath.Mover mover; // legacy 호환·미사용
internal AnimationController control;
@ -77,6 +80,8 @@ namespace Platformer.Mechanics
// PD 명시 2026-05-08 — 자동 patrol 시작 위치 저장 + 첫 목표 설정
_startX = transform.position.x;
_lastX = _startX;
_stuckTimer = 0f;
_patrolPhase = 0;
SetNextPatrolTarget();
}
@ -107,6 +112,25 @@ namespace Platformer.Mechanics
float moveDir = Mathf.Sign(dx);
// BT81 — 벽 정지 검출 (PD 보고 2026-05-08): 일정 시간 transform.x 변경 미세 시 = 벽 영역 → 다음 phase 강제
if (Mathf.Abs(transform.position.x - _lastX) < 0.01f)
{
_stuckTimer += Time.deltaTime;
if (_stuckTimer > stuckThresholdTime)
{
_patrolPhase = (_patrolPhase + 1) % 4;
SetNextPatrolTarget();
dx = _targetX - transform.position.x;
moveDir = Mathf.Sign(dx);
_stuckTimer = 0f;
}
}
else
{
_stuckTimer = 0f;
}
_lastX = transform.position.x;
// 절벽 검출 — 발 앞 영역 Raycast 지면 X 시 시작 위치로 즉시 복귀
if (Mathf.Abs(dx) > patrolArriveThreshold && _collider != null)
{