From 40600da46a7bc3f005858e5d5c831ccac61836a4 Mon Sep 17 00:00:00 2001 From: swrring Date: Fri, 15 May 2026 00:18:06 +0900 Subject: [PATCH] =?UTF-8?q?feat(BT12-Dev):=20=EB=B0=95=EC=A5=90=20(M002)?= =?UTF-8?q?=20=EB=82=A0=EC=9C=BC=EB=8A=94=20=EB=AA=AC=EC=8A=A4=ED=84=B0=20?= =?UTF-8?q?=E2=80=94=20IsFlying=20flag=20(PD=20=EC=A7=80=EC=8B=9C=202026-0?= =?UTF-8?q?5-15)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PD 보고: 1. "Enemy_M002_Bat 몬스터는 날으는 몬스터이기 때문에 y위치를 높이고 싶은데 자꾸 땅으로 내려오는 현상을 수정해줘." 2. "이 몬스터가 이동하지 못하는 이유를 체크해보고 수정해줘." 원인 진단: 1. KinematicObject.FixedUpdate L107 else 분기 (velocity.y>=0) gravityModifier 무시·무조건 Physics2D.gravity 적용 → 박쥐 gravityModifier=0 해도 천천히 떨어짐 2. EnemyController.UpdatePatrol cliffCheck Raycast 영역 공중 박쥐 발 밑 ground 없음 → 즉시 TriggerReverse → 1초 cooldown 후 다시 검출 → 무한 좌우 반전 → 이동 0 3. EnemyController.Update L361 fallThreshold 떨어짐 검출 → 강제 텔레포트 _startY 복귀 정정: 1. KinematicObject.FixedUpdate else 분기에도 gravityModifier 곱 gravityModifier=0 → 자연 중력 무효 (Player gravityModifier=1 영역 영향 X·기존 동작 보존) 2. EnemyController.IsFlying bool 신규 (Inspector) - Awake 영역 IsFlying=true → control.gravityModifier=0·velocity=0 - UpdatePatrol cliffCheck 영역 !IsFlying 분기 (cliff skip) - Update 떨어짐 텔레포트 영역 !IsFlying 분기 (skip) 3. MonsterRandomizer.flyingFlags bool[] 신규 (Inspector·동일 length) - Awake 영역 random idx · flyingFlags[idx]=true → EnemyController.IsFlying=true 자동 set 검증 (Play 모드): - IsFlying=true 강제 set + y +3 이동 - [t=0] pos.y=0.50 · gravMod=0 - [t=3s] pos.y=0.50 (유지·떨어짐 X) · velocity=(-3.50, 0) (x patrol 이동·y 0) PD 후속: Enemy.prefab Inspector MonsterRandomizer.flyingFlags 영역 박쥐 (M002) idx 영역 true 설정 필요. Co-Authored-By: Claude Opus 4.7 (1M context) --- Assets/Scripts/Mechanics/EnemyController.cs | 17 +++++++++++++++-- Assets/Scripts/Mechanics/KinematicObject.cs | 4 +++- Assets/Scripts/Mechanics/MonsterRandomizer.cs | 12 ++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/Assets/Scripts/Mechanics/EnemyController.cs b/Assets/Scripts/Mechanics/EnemyController.cs index d60b305..35ec525 100644 --- a/Assets/Scripts/Mechanics/EnemyController.cs +++ b/Assets/Scripts/Mechanics/EnemyController.cs @@ -14,6 +14,10 @@ namespace Platformer.Mechanics { public AudioClip ouch; + // PD 지시 2026-05-15 — 날으는 몬스터 (M002 박쥐 등) 영역 — 중력·cliffCheck·떨어짐 텔레포트 모두 skip. + // MonsterRandomizer.flyingFlags 영역 자동 set 또는 Inspector 직접 토글 가능. + public bool IsFlying = false; + // BT12-Dev 2026-05-11 — 밟기 공격 기능 제거 (PD 지시): hitRangeX·hitRangeY·stompMinDy 폐기. // Enemy는 Player 공격에만 피해를 받으므로 Player ↔ Enemy 충돌 감지 자체 불필요. @@ -101,6 +105,13 @@ namespace Platformer.Mechanics // Layer 14 (Enemy) ↔ Layer 14 collide X·전역 1회 적용 (Awake 영역 매번 호출 무관·idempotent). Physics2D.IgnoreLayerCollision(14, 14, true); + // PD 지시 2026-05-15 — 날으는 몬스터 영역 중력 무효 (KinematicObject.gravityModifier=0) + if (IsFlying && control != null) + { + control.gravityModifier = 0f; + control.velocity = Vector2.zero; + } + // PD 명시 2026-05-08 — 자동 patrol 시작 위치 저장 (측정·target은 Start 시점) _startX = transform.position.x; _startY = transform.position.y; // BT102: 떨어짐 검출 기준 @@ -310,7 +321,8 @@ namespace Platformer.Mechanics // 벽 영역 = stuckTimer 영역 (50ms 정지 시 즉시 phase+2)으로 처리 // BT94 — 절벽·벽 검출은 phase cooldown 영역 끝난 후 활성 (좌우 반복 차단) - if (_phaseCooldown <= 0f) + // PD 지시 2026-05-15 — 날으는 몬스터 영역 cliffCheck skip (지면 없는 공중 patrol) + if (_phaseCooldown <= 0f && !IsFlying) { // BT96 — 절벽·벽 검출: transform + body 동시 push (가장자리에서 안전 영역으로 즉시 이동) if (_collider != null) @@ -358,7 +370,8 @@ namespace Platformer.Mechanics // BT102 — 떨어짐 검출 영역: y < _startY - fallThreshold 시 = 시작 위치 텔레포트 복귀 // PD 명시 (2026-05-08): 투명벽 폐기·떨어짐 차단 다른 방법 // 단순·근본 방법 — 떨어진 후 검출 영역 즉시 복귀 (영구 떨어짐 X) - if (_isInitialized && transform.position.y < _startY - fallThreshold) + // PD 지시 2026-05-15 — 날으는 몬스터 영역 떨어짐 검출 skip (공중 patrol 정상) + if (_isInitialized && !IsFlying && transform.position.y < _startY - fallThreshold) { Vector3 safe = new Vector3(_startX, _startY, transform.position.z); transform.position = safe; diff --git a/Assets/Scripts/Mechanics/KinematicObject.cs b/Assets/Scripts/Mechanics/KinematicObject.cs index bdd160f..6a97364 100644 --- a/Assets/Scripts/Mechanics/KinematicObject.cs +++ b/Assets/Scripts/Mechanics/KinematicObject.cs @@ -102,10 +102,12 @@ namespace Platformer.Mechanics protected virtual void FixedUpdate() { //if already falling, fall faster than the jump speed, otherwise use normal gravity. + // PD 지시 2026-05-15 — 날으는 몬스터 (gravityModifier=0) 영역 자연 중력 무효 + // else 분기에도 gravityModifier 곱해야 gravityModifier=0 정합. Player gravityModifier=1 영역 영향 X. if (velocity.y < 0) velocity += gravityModifier * Physics2D.gravity * Time.deltaTime; else - velocity += Physics2D.gravity * Time.deltaTime; + velocity += gravityModifier * Physics2D.gravity * Time.deltaTime; velocity.x = targetVelocity.x; diff --git a/Assets/Scripts/Mechanics/MonsterRandomizer.cs b/Assets/Scripts/Mechanics/MonsterRandomizer.cs index 12cc5dc..d18feda 100644 --- a/Assets/Scripts/Mechanics/MonsterRandomizer.cs +++ b/Assets/Scripts/Mechanics/MonsterRandomizer.cs @@ -15,6 +15,11 @@ namespace Platformer.Mechanics [Tooltip("6 AnimatorOverrideController (M001~M006).")] public AnimatorOverrideController[] overrideControllers; + // PD 지시 2026-05-15 — 날으는 몬스터 영역 (M002 박쥐 등) + // overrideControllers 영역 동일 length·true 영역 EnemyController.IsFlying=true 자동 set + [Tooltip("각 overrideController 영역 IsFlying flag (동일 length). 박쥐 등 공중 몬스터 영역 true.")] + public bool[] flyingFlags; + void Awake() { if (overrideControllers == null || overrideControllers.Length == 0) return; @@ -22,6 +27,13 @@ namespace Platformer.Mechanics if (anim == null) return; int idx = Random.Range(0, overrideControllers.Length); anim.runtimeAnimatorController = overrideControllers[idx]; + + // PD 지시 2026-05-15 — 박쥐 선택 시 EnemyController.IsFlying=true 자동 set + if (flyingFlags != null && idx < flyingFlags.Length && flyingFlags[idx]) + { + var ec = GetComponent(); + if (ec != null) ec.IsFlying = true; + } } } }