BT5-Dev #91: 절벽·벽 즉시 반대 이동·waitTimer arrive만 (자연스러운 patrol)
PD 보고 (2026-05-08): 1) 낭떠러지 떨어짐 잔존 / 2) 부들부들 / 3) 자연스러운 patrol 진단: - BT86 cliffCheckDistance 0.3 = 발 외부 0.017m → 너무 가까움 - 절벽 영역 도달 직전 검출 → 다음 frame 발 영역 절벽 진입 + waitTimer 1~3초 정지 → gravity로 떨어짐 - 벽 영역 = stuckTimer 50ms → phase+2 + waitTimer 정지 → 부들부들 정정 (BT91): 1. cliffCheckDistance: 0.3 → 0.8 (더 일찍 검출·발 외부 0.5m) 2. cliffCheckDepth: 1.5 → 2.0 (더 깊게) 3. 절벽 검출 시: phase+2 + 즉시 반대 방향 이동 (waitTimer X) - control.move.x = Mathf.Clamp(dx_new, -1, 1) 즉시 적용 4. 벽 정지 (stuckTimer 50ms) 시: phase+2 + 즉시 반대 방향 이동 (waitTimer X) 5. patrol arrive 시점만 waitTimer 1~3초 대기 (안전 영역만 정지) 효과: - 절벽 영역 = 더 일찍 검출 + 즉시 반대 이동 (정지 X·떨어짐 X) - 벽 영역 = 즉시 반대 이동 (부들부들 X) - arrive 시점만 자연스러운 1~3초 대기 - patrol 사이클: 이동 → arrive → 1~3초 idle → 이동 → arrive → idle (자연스러움) - 위험 영역 (벽·절벽) = 즉시 반응 (정지 X)
This commit is contained in:
parent
ec05dc0582
commit
c7943b177e
|
|
@ -26,8 +26,8 @@ namespace Platformer.Mechanics
|
||||||
public float patrolMinRange = 50f;
|
public float patrolMinRange = 50f;
|
||||||
public float patrolMaxRange = 75f;
|
public float patrolMaxRange = 75f;
|
||||||
public float patrolArriveThreshold = 0.5f;
|
public float patrolArriveThreshold = 0.5f;
|
||||||
public float cliffCheckDistance = 0.3f; // 발 앞 절벽 검출 거리 (BT86: 0.6→0.3 — 더 빠른 검출·낭떠러지 근처 Enemy 보호)
|
public float cliffCheckDistance = 0.8f; // BT91: 0.3→0.8 — 더 일찍 검출 (Enemy 이동 속도 대비 충분한 영역)
|
||||||
public float cliffCheckDepth = 1.5f; // 발 아래 Raycast 거리
|
public float cliffCheckDepth = 2.0f; // BT91: 1.5→2.0 — 더 깊게 검출
|
||||||
public LayerMask groundLayerMask = (1 << 0) | (1 << 16); // Layer 0 (지면) + Layer 16 (발판)
|
public LayerMask groundLayerMask = (1 << 0) | (1 << 16); // Layer 0 (지면) + Layer 16 (발판)
|
||||||
public float stuckThresholdTime = 0.05f; // BT90: 0.1→0.05 (50ms·거의 즉시)
|
public float stuckThresholdTime = 0.05f; // BT90: 0.1→0.05 (50ms·거의 즉시)
|
||||||
public float stuckMoveThreshold = 0.02f; // 정지 판정 거리 임계값 (미세 밀림 검출)
|
public float stuckMoveThreshold = 0.02f; // 정지 판정 거리 임계값 (미세 밀림 검출)
|
||||||
|
|
@ -134,7 +134,7 @@ namespace Platformer.Mechanics
|
||||||
// BT90 — 수평 Raycast 영역 폐기 (BT89 거짓 양성 — 같은 Tile cell 영역 검출)
|
// BT90 — 수평 Raycast 영역 폐기 (BT89 거짓 양성 — 같은 Tile cell 영역 검출)
|
||||||
// 벽 영역 = stuckTimer 영역 (50ms 정지 시 즉시 phase+2)으로 처리
|
// 벽 영역 = stuckTimer 영역 (50ms 정지 시 즉시 phase+2)으로 처리
|
||||||
|
|
||||||
// 절벽 검출 — 발 앞 Raycast 지면 X 시 phase+2 즉시 전환 (대기)
|
// BT91 — 절벽 검출: 즉시 반대 방향 이동 (waitTimer X — 정지 시 절벽 떨어짐)
|
||||||
if (_collider != null)
|
if (_collider != null)
|
||||||
{
|
{
|
||||||
Vector2 footAhead = new Vector2(
|
Vector2 footAhead = new Vector2(
|
||||||
|
|
@ -146,15 +146,15 @@ namespace Platformer.Mechanics
|
||||||
{
|
{
|
||||||
_patrolPhase = (_patrolPhase + 2) % 4;
|
_patrolPhase = (_patrolPhase + 2) % 4;
|
||||||
SetNextPatrolTarget();
|
SetNextPatrolTarget();
|
||||||
_waitTimer = Random.Range(waitMinTime, waitMaxTime);
|
|
||||||
if (control != null) control.move.x = 0f;
|
|
||||||
_stuckTimer = 0f;
|
_stuckTimer = 0f;
|
||||||
_lastX = transform.position.x;
|
_lastX = transform.position.x;
|
||||||
|
dx = _targetX - transform.position.x;
|
||||||
|
if (control != null) control.move.x = Mathf.Clamp(dx, -1, 1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// stuckTimer 보조 — 수평 Raycast 미감지 fallback (벽 정지 + 미세 밀림 0.1초 후 phase+2)
|
// BT91 — 벽 정지 (stuckTimer): 즉시 반대 방향 이동 (waitTimer X — 부들부들 차단)
|
||||||
if (Mathf.Abs(transform.position.x - _lastX) < stuckMoveThreshold)
|
if (Mathf.Abs(transform.position.x - _lastX) < stuckMoveThreshold)
|
||||||
{
|
{
|
||||||
_stuckTimer += Time.deltaTime;
|
_stuckTimer += Time.deltaTime;
|
||||||
|
|
@ -162,10 +162,10 @@ namespace Platformer.Mechanics
|
||||||
{
|
{
|
||||||
_patrolPhase = (_patrolPhase + 2) % 4;
|
_patrolPhase = (_patrolPhase + 2) % 4;
|
||||||
SetNextPatrolTarget();
|
SetNextPatrolTarget();
|
||||||
_waitTimer = Random.Range(waitMinTime, waitMaxTime);
|
|
||||||
if (control != null) control.move.x = 0f;
|
|
||||||
_stuckTimer = 0f;
|
_stuckTimer = 0f;
|
||||||
_lastX = transform.position.x;
|
_lastX = transform.position.x;
|
||||||
|
dx = _targetX - transform.position.x;
|
||||||
|
if (control != null) control.move.x = Mathf.Clamp(dx, -1, 1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue