feat(BT12-Dev): 박쥐 (M002) 날으는 몬스터 — IsFlying flag (PD 지시 2026-05-15)

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) <noreply@anthropic.com>
This commit is contained in:
깃 관리자 2026-05-15 00:18:06 +09:00
parent b86cecf4a1
commit 40600da46a
3 changed files with 30 additions and 3 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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<EnemyController>();
if (ec != null) ec.IsFlying = true;
}
}
}
}