fix(BT12-Dev): cliffCheck Trigger 제외 (CinemachineConfiner Trigger false positive)
PD: "발판 가장자리에 버티고 대기" 근본 (MCP Play 실측·자성 #13): - cliffCheck Physics2D.Raycast가 Trigger collider도 hit (queriesHitTriggers=true 기본값) - CinemachineConfiner: Layer 0·PolygonCollider2D·**isTrigger=True**·맵 전체 영역 - Raycast가 Confiner Trigger를 ground로 오인 → 발판 끝에서도 cliff 미감지 - Enemy가 발판 밖으로 진행 → 도달 후 wait·정지 fix: - Physics2D.Raycast → ContactFilter2D 버전 사용 - cf.useTriggers = false (Trigger 제외·Confiner 무시) - cf.useLayerMask = true·layerMask = groundLayerMask - 실제 발판/바닥 Solid Collider만 hit → cliff 정확 감지 → TriggerReverse·정상 patrol 회귀 영역 X: - Wall LayerMask·Composite·발판 PlatformEffector 영역 영역 X - 직전 Projectile useTriggers=false 패턴 정합 (BT12-Dev 2026-05-10) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
f13132ca9c
commit
486a149cd0
|
|
@ -316,8 +316,8 @@ namespace Platformer.Mechanics
|
|||
// BT90 — 수평 Raycast 영역 폐기 (BT89 거짓 양성 — 같은 Tile cell 영역 검출)
|
||||
// 벽 영역 = stuckTimer 영역 (50ms 정지 시 즉시 phase+2)으로 처리
|
||||
|
||||
// BT12-Dev 2026-05-12 — cliffCheck Enemy 영역 가장자리 상대 (PD: 발판 가장자리 걸쳐 대기 정정)
|
||||
// 절대 cliffCheckDistance 폐기·bounds.extents.x + edgeMargin 사용 → Enemy 영역 바로 앞 검사
|
||||
// BT12-Dev 2026-05-12 — cliffCheck Trigger 제외 (PD: CinemachineConfiner Trigger 영역 false positive 정정)
|
||||
// ContactFilter2D useTriggers=false·useLayerMask=true·실제 발판/바닥 Solid Collider만 hit
|
||||
if (_collider != null)
|
||||
{
|
||||
const float EDGE_MARGIN = 0.15f;
|
||||
|
|
@ -325,11 +325,17 @@ namespace Platformer.Mechanics
|
|||
float backX = _collider.bounds.center.x - moveDir * (_collider.bounds.extents.x + EDGE_MARGIN);
|
||||
float footY = _collider.bounds.min.y + 0.05f;
|
||||
|
||||
RaycastHit2D groundHitFwd = Physics2D.Raycast(new Vector2(fwdX, footY), Vector2.down, cliffCheckDepth, groundLayerMask);
|
||||
if (groundHitFwd.collider == null)
|
||||
var cf = new ContactFilter2D();
|
||||
cf.useTriggers = false;
|
||||
cf.useLayerMask = true;
|
||||
cf.layerMask = groundLayerMask;
|
||||
var hits = new RaycastHit2D[1];
|
||||
|
||||
int fwdCount = Physics2D.Raycast(new Vector2(fwdX, footY), Vector2.down, cf, hits, cliffCheckDepth);
|
||||
if (fwdCount == 0)
|
||||
{
|
||||
RaycastHit2D groundHitBack = Physics2D.Raycast(new Vector2(backX, footY), Vector2.down, cliffCheckDepth, groundLayerMask);
|
||||
if (groundHitBack.collider == null)
|
||||
int backCount = Physics2D.Raycast(new Vector2(backX, footY), Vector2.down, cf, hits, cliffCheckDepth);
|
||||
if (backCount == 0)
|
||||
{
|
||||
// 양측 cliff — 제자리 대기
|
||||
if (control != null) control.move.x = 0f;
|
||||
|
|
|
|||
Loading…
Reference in New Issue