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:
parent
3591bd218f
commit
cbde93a66d
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue