fix(BT12-Dev): KinematicObject base magic method override·body 초기화 (Enemy 영구 정지 근본)

PD: "여전히 움직이지 않아·실측해보고 근본 원인 체크"

근본 (MCP Play 실측·자성 #12·#13):
- KinematicObject.OnEnable·Start·Update·FixedUpdate 모두 `protected virtual`
- AnimationController는 KinematicObject 상속하지만 override X
- Unity는 Component 정의된 magic method만 호출·base class virtual은 derived가 override 안 하면 호출 안 됨
- 결과: KinematicObject.OnEnable 호출 X → body=NULL·KinematicObject.FixedUpdate 호출 X → velocity 갱신 X·gravity 적용 X
- Enemy 자연 낙하 X·patrol 동작 X·영구 정지

검증:
- MCP Play 후 body field reflection 읽기 → NULL
- Rigidbody2D 컴포넌트 자체는 GetComponent OK·OnEnable이 body 설정 안 함

fix (AnimationController):
1. Awake 영역에 base 초기화 위임:
   - body = GetComponent<Rigidbody2D>()·body.bodyType = Kinematic
   - contactFilter.useTriggers/SetLayerMask/useLayerMask
2. Update·FixedUpdate override 추가:
   - protected override void Update() { base.Update(); }
   - protected override void FixedUpdate() { base.FixedUpdate(); }
   - Unity가 AnimationController 인스턴스의 Update/FixedUpdate 호출 → base 실행

검증 후 (MCP Play):
- body=OK·IsGrounded=True·자연 낙하 정합 (pos.y=-2.5 등)
- Enemy 일부 발판 위 정착·일부 InfiniteHorizontalGround 영역 밖 무한 낙하 (별건)

회귀 영역 X:
- spriteRenderer/animator GetComponentInChildren·field initializer 가드 영역 영역 X
- KinematicObject 자체 영역 영역 X (다른 KinematicObject 상속 클래스는 별도 검증)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
깃 관리자 2026-05-12 17:57:01 +09:00
parent 899bbf16f9
commit 35923be06d
1 changed files with 19 additions and 0 deletions

View File

@ -50,6 +50,25 @@ namespace Platformer.Mechanics
if (animator == null) animator = GetComponentInChildren<Animator>();
// BT12-Dev 2026-05-12 — field initializer Awake 영역 이동 (Editor·Play mode 전환 시 model 미초기화 NRE 회피).
try { model = Simulation.GetModel<PlatformerModel>(); } catch { model = null; }
// BT12-Dev 2026-05-12 — KinematicObject base 영역 protected virtual OnEnable/Start/Update/FixedUpdate Unity 호출 X 정정
// (override X·derived class만 magic method 영역). Awake 영역 base 초기화 위임.
body = GetComponent<Rigidbody2D>();
if (body != null) body.bodyType = RigidbodyType2D.Kinematic;
contactFilter.useTriggers = false;
contactFilter.SetLayerMask(Physics2D.GetLayerCollisionMask(gameObject.layer));
contactFilter.useLayerMask = true;
}
// BT12-Dev 2026-05-12 — Update·FixedUpdate Unity 호출 정합 (override 영역 derived 영역 호출 영역)
protected override void Update()
{
base.Update();
}
protected override void FixedUpdate()
{
base.FixedUpdate();
}
protected override void ComputeVelocity()