BT5-Dev #86: Enemy 속도 2배 느림·미세 밀림 검출·절벽 즉시 phase 전환 (PD 3건)

PD 보고 (2026-05-08):
1. 몬스터 이동속도 너무 빨라 2배 느리게
2. 벽 가장자리 미세 밀림 → 낭떠러지 떨어짐
3. 낭떠러지 근처 생성 Enemy 이동 중 떨어짐

정정 (BT86):

1. AnimationController maxSpeed 7 → 3.5 (Enemy.prefab):
   - frame당 이동 거리 ~0.117m → ~0.058m (2배 느림)

2. stuckTimer 영역 임계값 정정:
   - 거리: |transform.x - _lastX| < 0.01 → 0.02 (미세 밀림 검출)
   - 시간: stuckThresholdTime 0.5 → 0.3 (빠른 phase 전환)
   - stuckMoveThreshold Inspector 영역 신규

3. 절벽 검출 영역 정정:
   - cliffCheckDistance: 0.6 → 0.3 (더 빠른 검출·낭떠러지 근처 보호)
   - 시작 위치 복귀 영역 폐기 → 다음 phase 강제 (시작 위치도 절벽 가능 가설)

효과:
- Enemy 이동속도 2배 느림
- 미세 밀림 (< 0.02m/frame) = stuckTimer 누적 → 0.3초 후 phase 전환
- 절벽 영역 = 즉시 다음 phase (반대 방향 patrol) — 시작 위치 복귀 X
- 낭떠러지 근처 생성 Enemy = 절벽 영역 검출 → 즉시 반대 방향
This commit is contained in:
깃 관리자 2026-05-08 12:16:38 +09:00
parent 007b4dd61a
commit 8baa3a6f80
2 changed files with 14 additions and 11 deletions

View File

@ -200,7 +200,7 @@ MonoBehaviour:
minGroundNormalY: 0.65
gravityModifier: 1
velocity: {x: 0, y: 0}
maxSpeed: 7
maxSpeed: 3.5
jumpTakeOffSpeed: 7
move: {x: 0, y: 0}
jump: 0

View File

@ -26,10 +26,11 @@ namespace Platformer.Mechanics
public float patrolMinRange = 100f;
public float patrolMaxRange = 150f;
public float patrolArriveThreshold = 0.5f;
public float cliffCheckDistance = 0.6f; // 발 앞 절벽 검출 거리
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; // 벽 정지 검출 시간 (BT85: 0.3→0.5 — 정상 이동 미세 영역 거짓 양성 차단)
public float cliffCheckDistance = 0.3f; // 발 앞 절벽 검출 거리 (BT86: 0.6→0.3 — 더 빠른 검출·낭떠러지 근처 Enemy 보호)
public float cliffCheckDepth = 1.5f; // 발 아래 Raycast 거리
public LayerMask groundLayerMask = (1 << 0) | (1 << 16); // Layer 0 (지면) + Layer 16 (발판)
public float stuckThresholdTime = 0.3f; // 벽 정지 검출 시간 (BT86: 0.5→0.3 — 빠른 영역 전환)
public float stuckMoveThreshold = 0.02f; // BT86: 정지 판정 거리 임계값 (0.01→0.02 — 미세 밀림 검출)
private float _startX;
private float _targetX;
@ -112,8 +113,8 @@ 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)
// BT86 — 벽 정지·미세 밀림 검출 (PD 보고 2026-05-08): 임계값 거리 0.01→0.02 — 미세 밀림도 정지 인식
if (Mathf.Abs(transform.position.x - _lastX) < stuckMoveThreshold)
{
_stuckTimer += Time.deltaTime;
if (_stuckTimer > stuckThresholdTime)
@ -135,7 +136,9 @@ namespace Platformer.Mechanics
// BT83/BT84 영역 = bounds 외부+0.5m 영역도 옆 Tile (평지 인접) 검출 → 거짓 양성 → patrol X
// 정정: 수평 Raycast 폐기 + stuckTimer 영역 0.5초 (BT81 영역 회복) — 벽 정지 시 다음 phase
// 절벽 검출 — 발 앞 영역 Raycast 지면 X 시 시작 위치로 즉시 복귀
// BT86 — 절벽 검출 (PD 보고 2026-05-08): 시작 위치 복귀 폐기·즉시 다음 phase 강제
// 시작 위치도 절벽 가능 (낭떠러지 근처 생성 Enemy) → 시작 위치 복귀 시 떨어짐
// 정정: 다음 phase 강제 = 반대 방향 patrol 시도
if (Mathf.Abs(dx) > patrolArriveThreshold && _collider != null)
{
Vector2 footAhead = new Vector2(
@ -145,11 +148,11 @@ namespace Platformer.Mechanics
RaycastHit2D groundHit = Physics2D.Raycast(footAhead, Vector2.down, cliffCheckDepth, groundLayerMask);
if (groundHit.collider == null)
{
// 절벽 영역 → 시작 위치 즉시 복귀 (반대 방향 phase 강제)
_patrolPhase = (_patrolPhase % 2 == 0) ? _patrolPhase + 1 : _patrolPhase;
_targetX = _startX;
_patrolPhase = (_patrolPhase + 1) % 4;
SetNextPatrolTarget();
dx = _targetX - transform.position.x;
moveDir = Mathf.Sign(dx);
_stuckTimer = 0f;
}
}