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:
parent
b86cecf4a1
commit
40600da46a
|
|
@ -14,6 +14,10 @@ namespace Platformer.Mechanics
|
||||||
{
|
{
|
||||||
public AudioClip ouch;
|
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 폐기.
|
// BT12-Dev 2026-05-11 — 밟기 공격 기능 제거 (PD 지시): hitRangeX·hitRangeY·stompMinDy 폐기.
|
||||||
// Enemy는 Player 공격에만 피해를 받으므로 Player ↔ Enemy 충돌 감지 자체 불필요.
|
// Enemy는 Player 공격에만 피해를 받으므로 Player ↔ Enemy 충돌 감지 자체 불필요.
|
||||||
|
|
||||||
|
|
@ -101,6 +105,13 @@ namespace Platformer.Mechanics
|
||||||
// Layer 14 (Enemy) ↔ Layer 14 collide X·전역 1회 적용 (Awake 영역 매번 호출 무관·idempotent).
|
// Layer 14 (Enemy) ↔ Layer 14 collide X·전역 1회 적용 (Awake 영역 매번 호출 무관·idempotent).
|
||||||
Physics2D.IgnoreLayerCollision(14, 14, true);
|
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 시점)
|
// PD 명시 2026-05-08 — 자동 patrol 시작 위치 저장 (측정·target은 Start 시점)
|
||||||
_startX = transform.position.x;
|
_startX = transform.position.x;
|
||||||
_startY = transform.position.y; // BT102: 떨어짐 검출 기준
|
_startY = transform.position.y; // BT102: 떨어짐 검출 기준
|
||||||
|
|
@ -310,7 +321,8 @@ namespace Platformer.Mechanics
|
||||||
// 벽 영역 = stuckTimer 영역 (50ms 정지 시 즉시 phase+2)으로 처리
|
// 벽 영역 = stuckTimer 영역 (50ms 정지 시 즉시 phase+2)으로 처리
|
||||||
|
|
||||||
// BT94 — 절벽·벽 검출은 phase cooldown 영역 끝난 후 활성 (좌우 반복 차단)
|
// BT94 — 절벽·벽 검출은 phase cooldown 영역 끝난 후 활성 (좌우 반복 차단)
|
||||||
if (_phaseCooldown <= 0f)
|
// PD 지시 2026-05-15 — 날으는 몬스터 영역 cliffCheck skip (지면 없는 공중 patrol)
|
||||||
|
if (_phaseCooldown <= 0f && !IsFlying)
|
||||||
{
|
{
|
||||||
// BT96 — 절벽·벽 검출: transform + body 동시 push (가장자리에서 안전 영역으로 즉시 이동)
|
// BT96 — 절벽·벽 검출: transform + body 동시 push (가장자리에서 안전 영역으로 즉시 이동)
|
||||||
if (_collider != null)
|
if (_collider != null)
|
||||||
|
|
@ -358,7 +370,8 @@ namespace Platformer.Mechanics
|
||||||
// BT102 — 떨어짐 검출 영역: y < _startY - fallThreshold 시 = 시작 위치 텔레포트 복귀
|
// BT102 — 떨어짐 검출 영역: y < _startY - fallThreshold 시 = 시작 위치 텔레포트 복귀
|
||||||
// PD 명시 (2026-05-08): 투명벽 폐기·떨어짐 차단 다른 방법
|
// PD 명시 (2026-05-08): 투명벽 폐기·떨어짐 차단 다른 방법
|
||||||
// 단순·근본 방법 — 떨어진 후 검출 영역 즉시 복귀 (영구 떨어짐 X)
|
// 단순·근본 방법 — 떨어진 후 검출 영역 즉시 복귀 (영구 떨어짐 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);
|
Vector3 safe = new Vector3(_startX, _startY, transform.position.z);
|
||||||
transform.position = safe;
|
transform.position = safe;
|
||||||
|
|
|
||||||
|
|
@ -102,10 +102,12 @@ namespace Platformer.Mechanics
|
||||||
protected virtual void FixedUpdate()
|
protected virtual void FixedUpdate()
|
||||||
{
|
{
|
||||||
//if already falling, fall faster than the jump speed, otherwise use normal gravity.
|
//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)
|
if (velocity.y < 0)
|
||||||
velocity += gravityModifier * Physics2D.gravity * Time.deltaTime;
|
velocity += gravityModifier * Physics2D.gravity * Time.deltaTime;
|
||||||
else
|
else
|
||||||
velocity += Physics2D.gravity * Time.deltaTime;
|
velocity += gravityModifier * Physics2D.gravity * Time.deltaTime;
|
||||||
|
|
||||||
velocity.x = targetVelocity.x;
|
velocity.x = targetVelocity.x;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,11 @@ namespace Platformer.Mechanics
|
||||||
[Tooltip("6 AnimatorOverrideController (M001~M006).")]
|
[Tooltip("6 AnimatorOverrideController (M001~M006).")]
|
||||||
public AnimatorOverrideController[] overrideControllers;
|
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()
|
void Awake()
|
||||||
{
|
{
|
||||||
if (overrideControllers == null || overrideControllers.Length == 0) return;
|
if (overrideControllers == null || overrideControllers.Length == 0) return;
|
||||||
|
|
@ -22,6 +27,13 @@ namespace Platformer.Mechanics
|
||||||
if (anim == null) return;
|
if (anim == null) return;
|
||||||
int idx = Random.Range(0, overrideControllers.Length);
|
int idx = Random.Range(0, overrideControllers.Length);
|
||||||
anim.runtimeAnimatorController = overrideControllers[idx];
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue