diff --git a/Assets/Scripts/Mechanics/EnemyController.cs b/Assets/Scripts/Mechanics/EnemyController.cs index 4d80df2..951604e 100644 --- a/Assets/Scripts/Mechanics/EnemyController.cs +++ b/Assets/Scripts/Mechanics/EnemyController.cs @@ -42,8 +42,9 @@ namespace Platformer.Mechanics private float _waitTimer; // arrive 후 대기 누적 시간 (1~3초 random) private float _phaseCooldown; // phase 전환 직후 절벽·벽 검출 비활성 시간 private const float PHASE_COOLDOWN = 1.0f; // BT95: 0.5→1.0 — 긴 영역 cooldown (좌우 반복 영구 차단) - private float _maxRightRange; // BT94: 시작 시 측정 — 우측 안전 patrol 거리 - private float _maxLeftRange; // BT94: 시작 시 측정 — 좌측 안전 patrol 거리 + private float _maxRightRange; // 시작 시 측정 — 우측 안전 patrol 거리 + private float _maxLeftRange; // 시작 시 측정 — 좌측 안전 patrol 거리 + private bool _isInitialized; // BT97: Start 측정 완료 영역 (Awake 이후 활성) internal PatrolPath.Mover mover; // legacy 호환·미사용 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; _lastX = _startX; _stuckTimer = 0f; _phaseCooldown = 0f; + _patrolPhase = 0; + _isInitialized = false; + } - // BT94 — 시작 시 좌·우 안전 patrol 거리 측정 (좁은 영역 Enemy 떨어짐 차단) + // BT97 — Start 시점 안전 거리 측정 (AutoForeground Tile data 활성 후·AfterSceneLoad 이후) + void Start() + { _maxRightRange = MeasureSafeWalkDistance(1f); _maxLeftRange = MeasureSafeWalkDistance(-1f); - - _patrolPhase = 0; SetNextPatrolTarget(); + _isInitialized = true; } // BT96 — 절벽·벽 검출 시 즉시 반대 방향 이동 (transform + body 동시 push·KinematicObject 정합) @@ -160,6 +165,13 @@ namespace Platformer.Mechanics // BT89 — patrol·벽·절벽 검출·대기 영역 통합 처리 void UpdatePatrol() { + // BT97 — Start 측정 완료 전까지 patrol 비활성 (AutoForeground Tile data 영역 활성 대기) + if (!_isInitialized) + { + if (control != null) control.move.x = 0f; + return; + } + // 대기 영역 — control.move.x = 0 + Timer 감소 if (_waitTimer > 0f) {