BT5-Dev #88: Enemy 절벽·벽 검출 phase+2 (시작 위치 복귀 폐기·즉시 반대 방향)

PD 보고 (2026-05-08): "이번에는 몬스터들이 다시 낭떠러지로 떨어져버렸어 (이전 버전은 떨어지지 않음)"

진단:
- BT86 절벽 검출 = phase+1 (= 시작 위치 복귀)
- BT87 patrol 거리 절반 (50~75) → 시작 위치 ↔ 절벽 거리 작아짐
- 시작 위치 복귀 도중 = 절벽 영역 도달 → 떨어짐

정정 (BT88):
- 절벽 검출 시: phase+2 (반대 방향 patrol·시작 위치 복귀 폐기)
- 벽 정지(stuckTimer) 시: phase+2 (동일·즉시 반대 방향)

phase 전환 영역:
- phase 0 (우측 out) → phase 2 (좌측 out)
- phase 1 (시작 복귀·우측에서) → phase 3 (시작 복귀·좌측에서)
- phase 2 (좌측 out) → phase 0 (우측 out)
- phase 3 (시작 복귀·좌측에서) → phase 1 (시작 복귀·우측에서)

효과:
- 절벽 영역 = 즉시 반대 방향 patrol (시작 위치 영역 X)
- 벽 충돌 = 동일 (즉시 반대 방향)
- 시작 위치 절벽 근처 영역 = 안전
This commit is contained in:
깃 관리자 2026-05-08 12:34:43 +09:00
parent 050b00eaee
commit eeb7ded8ee
1 changed files with 5 additions and 6 deletions

View File

@ -113,13 +113,13 @@ namespace Platformer.Mechanics
float moveDir = Mathf.Sign(dx);
// BT86 — 벽 정지·미세 밀림 검출 (PD 보고 2026-05-08): 임계값 거리 0.01→0.02 — 미세 밀림도 정지 인식
// 벽 정지·미세 밀림 검출 — BT88: phase+2 (반대 방향 patrol·시작 위치 복귀 폐기)
if (Mathf.Abs(transform.position.x - _lastX) < stuckMoveThreshold)
{
_stuckTimer += Time.deltaTime;
if (_stuckTimer > stuckThresholdTime)
{
_patrolPhase = (_patrolPhase + 1) % 4;
_patrolPhase = (_patrolPhase + 2) % 4;
SetNextPatrolTarget();
dx = _targetX - transform.position.x;
moveDir = Mathf.Sign(dx);
@ -136,9 +136,8 @@ namespace Platformer.Mechanics
// BT83/BT84 영역 = bounds 외부+0.5m 영역도 옆 Tile (평지 인접) 검출 → 거짓 양성 → patrol X
// 정정: 수평 Raycast 폐기 + stuckTimer 영역 0.5초 (BT81 영역 회복) — 벽 정지 시 다음 phase
// BT86 — 절벽 검출 (PD 보고 2026-05-08): 시작 위치 복귀 폐기·즉시 다음 phase 강제
// 시작 위치도 절벽 가능 (낭떠러지 근처 생성 Enemy) → 시작 위치 복귀 시 떨어짐
// 정정: 다음 phase 강제 = 반대 방향 patrol 시도
// 절벽 검출 — BT88: phase+2 (반대 방향 patrol·시작 위치 복귀 폐기)
// 시작 위치 복귀 영역 = 시작 위치도 절벽 근처 시 도중 떨어짐 → phase+2로 즉시 반대 방향
if (Mathf.Abs(dx) > patrolArriveThreshold && _collider != null)
{
Vector2 footAhead = new Vector2(
@ -148,7 +147,7 @@ namespace Platformer.Mechanics
RaycastHit2D groundHit = Physics2D.Raycast(footAhead, Vector2.down, cliffCheckDepth, groundLayerMask);
if (groundHit.collider == null)
{
_patrolPhase = (_patrolPhase + 1) % 4;
_patrolPhase = (_patrolPhase + 2) % 4;
SetNextPatrolTarget();
dx = _targetX - transform.position.x;
moveDir = Mathf.Sign(dx);