BT5-Dev #83: Enemy 수평 벽 검출 추가 (벽 가장자리 미세 밀림 차단)
PD 보고 (2026-05-08): "몬스터가 벽 가장자리에서 이동하지 못하게 되면 밀려나면서 결국 낭떠러지로 떨어지고 있어" 진단: - 벽 가장자리 정지 시 미세 밀림(< 0.01 영역) → stuckTimer 누적 X - 다음 phase 전환 X → 미세 밀림 누적 → 결국 절벽 영역 도달 → 떨어짐 - BT81 stuckTimer 영역만으로 부족 (정지 임계값 0.01 미달 미세 밀림 미감지) 정정 (BT83): 1. wallCheckDistance 영역 신규 (Inspector 노출·기본 0.5) 2. 수평 벽 Raycast 검출 추가: - 발 영역 horizontal (moveDir 방향) Raycast Layer 0+16 - 벽 검출 시 즉시 다음 phase 강제 (stuckTimer 영역과 분리) 3. stuckThresholdTime: 0.5 → 0.3 (빠른 영역 전환) 효과: - 벽 영역 즉시 검출 + 다음 phase = 정지·밀림 영역 도달 X - 절벽 영역 도달 X = 떨어짐 차단 - stuckTimer 영역 = 보조 (벽 검출 + 미감지 fallback) 후속 의무: - PD Refresh+Play 시각 검증
This commit is contained in:
parent
4d83bbc028
commit
4603fdf947
|
|
@ -29,7 +29,8 @@ namespace Platformer.Mechanics
|
|||
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; // 벽 정지 검출 시간 (BT81)
|
||||
public float stuckThresholdTime = 0.3f; // 벽 정지 검출 시간 (BT83: 0.5→0.3 — 빠른 영역 전환)
|
||||
public float wallCheckDistance = 0.5f; // BT83: 수평 벽 Raycast 거리 (벽 가장자리 미세 밀림 차단)
|
||||
|
||||
private float _startX;
|
||||
private float _targetX;
|
||||
|
|
@ -131,6 +132,25 @@ namespace Platformer.Mechanics
|
|||
}
|
||||
_lastX = transform.position.x;
|
||||
|
||||
// BT83 — 수평 벽 검출 (PD 보고 2026-05-08): 벽 가장자리 미세 밀림 → 절벽 떨어짐 차단
|
||||
// 발 영역 horizontal Raycast Layer 0+16 검출 시 = 벽 → 다음 phase 즉시 강제
|
||||
if (Mathf.Abs(dx) > patrolArriveThreshold && _collider != null)
|
||||
{
|
||||
Vector2 wallOrigin = new Vector2(
|
||||
_collider.bounds.center.x + moveDir * 0.05f,
|
||||
_collider.bounds.center.y
|
||||
);
|
||||
RaycastHit2D wallHit = Physics2D.Raycast(wallOrigin, new Vector2(moveDir, 0), wallCheckDistance, groundLayerMask);
|
||||
if (wallHit.collider != null)
|
||||
{
|
||||
_patrolPhase = (_patrolPhase + 1) % 4;
|
||||
SetNextPatrolTarget();
|
||||
dx = _targetX - transform.position.x;
|
||||
moveDir = Mathf.Sign(dx);
|
||||
_stuckTimer = 0f;
|
||||
}
|
||||
}
|
||||
|
||||
// 절벽 검출 — 발 앞 영역 Raycast 지면 X 시 시작 위치로 즉시 복귀
|
||||
if (Mathf.Abs(dx) > patrolArriveThreshold && _collider != null)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue