BT5-Dev #97: Start 시점 안전 거리 측정 (AutoForeground Tile 활성 후)

PD 보고 (2026-05-08): 벽 영역 자연스러움 ·낭떠러지 떨어짐 잔존

진단:
- BT94 MeasureSafeWalkDistance = Awake 시점 호출
- AutoForeground Tile data = RuntimeInitializeOnLoadMethod(AfterSceneLoad) 시점 활성
- Unity execution order: Awake → AfterSceneLoad → Start
- = Awake 시점 = AutoForeground Tile 영역 미처리 → MeasureSafeWalkDistance 영역 = AutoForeground 발판 검출 X
- = 안전 거리 영역 부정확 (실제 절벽 영역과 다름) → patrol 영역 절벽 도달 → 떨어짐

정정 (BT97):
1. _isInitialized 영역 신규 (Awake = false / Start = true)
2. Awake 시점 = _startX·_lastX·patrolPhase 영역만 초기화 (측정·target X)
3. Start 시점 (AfterSceneLoad 이후) MeasureSafeWalkDistance 호출 + SetNextPatrolTarget + _isInitialized=true
4. UpdatePatrol 영역 시작에서 !_isInitialized 시 control.move.x = 0 + return (patrol 비활성)

효과:
- AutoForeground Tile 영역 활성 후 안전 거리 측정 → 정확한 절벽 거리
- patrol 영역 = 안전 거리 cap 정확 → 절벽 영역 도달 X
- 측정 전 1 frame patrol 비활성 = 안전
This commit is contained in:
깃 관리자 2026-05-08 14:00:46 +09:00
parent 53e6a5935f
commit e701829356
1 changed files with 18 additions and 6 deletions

View File

@ -42,8 +42,9 @@ namespace Platformer.Mechanics
private float _waitTimer; // arrive 후 대기 누적 시간 (1~3초 random) private float _waitTimer; // arrive 후 대기 누적 시간 (1~3초 random)
private float _phaseCooldown; // phase 전환 직후 절벽·벽 검출 비활성 시간 private float _phaseCooldown; // phase 전환 직후 절벽·벽 검출 비활성 시간
private const float PHASE_COOLDOWN = 1.0f; // BT95: 0.5→1.0 — 긴 영역 cooldown (좌우 반복 영구 차단) private const float PHASE_COOLDOWN = 1.0f; // BT95: 0.5→1.0 — 긴 영역 cooldown (좌우 반복 영구 차단)
private float _maxRightRange; // BT94: 시작 시 측정 — 우측 안전 patrol 거리 private float _maxRightRange; // 시작 시 측정 — 우측 안전 patrol 거리
private float _maxLeftRange; // BT94: 시작 시 측정 — 좌측 안전 patrol 거리 private float _maxLeftRange; // 시작 시 측정 — 좌측 안전 patrol 거리
private bool _isInitialized; // BT97: Start 측정 완료 영역 (Awake 이후 활성)
internal PatrolPath.Mover mover; // legacy 호환·미사용 internal PatrolPath.Mover mover; // legacy 호환·미사용
internal AnimationController control; internal AnimationController control;
@ -88,18 +89,22 @@ namespace Platformer.Mechanics
} }
} }
// PD 명시 2026-05-08 — 자동 patrol 시작 위치 저장 + 첫 목표 설정 // PD 명시 2026-05-08 — 자동 patrol 시작 위치 저장 (측정·target은 Start 시점)
_startX = transform.position.x; _startX = transform.position.x;
_lastX = _startX; _lastX = _startX;
_stuckTimer = 0f; _stuckTimer = 0f;
_phaseCooldown = 0f; _phaseCooldown = 0f;
_patrolPhase = 0;
_isInitialized = false;
}
// BT94 — 시작 시 좌·우 안전 patrol 거리 측정 (좁은 영역 Enemy 떨어짐 차단) // BT97 — Start 시점 안전 거리 측정 (AutoForeground Tile data 활성 후·AfterSceneLoad 이후)
void Start()
{
_maxRightRange = MeasureSafeWalkDistance(1f); _maxRightRange = MeasureSafeWalkDistance(1f);
_maxLeftRange = MeasureSafeWalkDistance(-1f); _maxLeftRange = MeasureSafeWalkDistance(-1f);
_patrolPhase = 0;
SetNextPatrolTarget(); SetNextPatrolTarget();
_isInitialized = true;
} }
// BT96 — 절벽·벽 검출 시 즉시 반대 방향 이동 (transform + body 동시 push·KinematicObject 정합) // BT96 — 절벽·벽 검출 시 즉시 반대 방향 이동 (transform + body 동시 push·KinematicObject 정합)
@ -160,6 +165,13 @@ namespace Platformer.Mechanics
// BT89 — patrol·벽·절벽 검출·대기 영역 통합 처리 // BT89 — patrol·벽·절벽 검출·대기 영역 통합 처리
void UpdatePatrol() void UpdatePatrol()
{ {
// BT97 — Start 측정 완료 전까지 patrol 비활성 (AutoForeground Tile data 영역 활성 대기)
if (!_isInitialized)
{
if (control != null) control.move.x = 0f;
return;
}
// 대기 영역 — control.move.x = 0 + Timer 감소 // 대기 영역 — control.move.x = 0 + Timer 감소
if (_waitTimer > 0f) if (_waitTimer > 0f)
{ {