From e701829356000116597495b8e2e0e3490580bc8b Mon Sep 17 00:00:00 2001 From: swrring Date: Fri, 8 May 2026 14:00:46 +0900 Subject: [PATCH] =?UTF-8?q?BT5-Dev=20#97:=20Start=20=EC=8B=9C=EC=A0=90=20?= =?UTF-8?q?=EC=95=88=EC=A0=84=20=EA=B1=B0=EB=A6=AC=20=EC=B8=A1=EC=A0=95=20?= =?UTF-8?q?(AutoForeground=20Tile=20=ED=99=9C=EC=84=B1=20=ED=9B=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 비활성 = 안전 --- Assets/Scripts/Mechanics/EnemyController.cs | 24 +++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) 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) {