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:
parent
53e6a5935f
commit
e701829356
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue