BT5-Dev #85: Enemy y+0.3·수평 Raycast 폐기 (PD 2건)

PD 보고 (2026-05-08):
1. 몬스터 바닥 뚫고 나옴 (이미지 첨부)
2. 몬스터 여전히 이동 X

진단:
- 버그 1: sprite 발 영역(transform.y - 0.63·sprite half) ↔ Capsule bounds.min.y(transform.y - 0.39) = 0.24m 차이. Capsule 영역 위 Tile 표면 → sprite 영역 발이 0.24m 침투 → 시각상 침투
- 버그 2: BT83/BT84 수평 벽 Raycast 영역(bounds 외부 + 0.5m)도 옆 Tile (평지 인접) 검출 → 거짓 양성 → 매 frame phase 강제 → 모든 Enemy 정지

정정 (BT85):
1. transform.y 추가 +0.3 (Enemy.prefab 1.532→1.832 + Scene 인스턴스 19건 +0.3)
2. EnemyController.cs:
   - 수평 벽 Raycast (BT83/BT84 영역) 폐기
   - wallCheckDistance Inspector 영역 폐기
   - stuckThresholdTime: 0.3→0.5 (BT81 영역 회복·정상 이동 미세 영역 거짓 양성 차단)
   - 절벽 검출 영역 그대로
   - stuckTimer 영역 그대로 (벽 정지 시 0.5초 후 다음 phase 강제)

효과:
- 시각상 발 영역 침투 X (transform.y +0.3 → 총 +0.8 from 원본)
- 정상 patrol 영역 = stuckTimer 영역 0 (frame당 transform.x 변경 큰 영역)
- 벽 영역 정지 시 = stuckTimer 영역 0.5초 누적 → 다음 phase 강제
- 절벽 영역 = footAhead Raycast 영역 (Layer 0+16) 검출 → 시작 위치 복귀

후속 의무:
- PD Refresh+Play 시각 검증
This commit is contained in:
깃 관리자 2026-05-08 11:52:05 +09:00
parent aad1b4e0ed
commit 007b4dd61a
3 changed files with 24 additions and 42 deletions

View File

@ -33,7 +33,7 @@ Transform:
m_GameObject: {fileID: 1661912868639658944}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 5.508, y: 1.532, z: 1}
m_LocalPosition: {x: 5.508, y: 1.832, z: 1}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []

View File

@ -4142,7 +4142,7 @@ PrefabInstance:
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
propertyPath: m_LocalPosition.y
value: -6.4554644
value: -6.1554644
objectReference: {fileID: 0}
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
@ -5203,7 +5203,7 @@ PrefabInstance:
- target: {fileID: 5102505034379151491, guid: 6f545478bd0fb7a478ed6f674a5210f5,
type: 3}
propertyPath: m_LocalPosition.y
value: -0.7901306
value: -0.4901306
objectReference: {fileID: 0}
- target: {fileID: 5102505034379151491, guid: 6f545478bd0fb7a478ed6f674a5210f5,
type: 3}
@ -13067,7 +13067,7 @@ PrefabInstance:
- target: {fileID: 4009130065698333725, guid: 9a1bd12ebb35d4dc997aa0c5494eda9b,
type: 3}
propertyPath: m_LocalPosition.y
value: 0.5000000
value: 0.8000000
objectReference: {fileID: 0}
- target: {fileID: 4009130065698333725, guid: 9a1bd12ebb35d4dc997aa0c5494eda9b,
type: 3}
@ -16838,7 +16838,7 @@ PrefabInstance:
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
propertyPath: m_LocalPosition.y
value: -3.3154645
value: -3.0154645
objectReference: {fileID: 0}
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
@ -118941,7 +118941,7 @@ PrefabInstance:
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
propertyPath: m_LocalPosition.y
value: 1.8445356
value: 2.1445356
objectReference: {fileID: 0}
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
@ -121349,7 +121349,7 @@ PrefabInstance:
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
propertyPath: m_LocalPosition.y
value: -6.4554644
value: -6.1554644
objectReference: {fileID: 0}
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
@ -125071,7 +125071,7 @@ PrefabInstance:
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
propertyPath: m_LocalPosition.y
value: -0.9454646
value: -0.6454646
objectReference: {fileID: 0}
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
@ -125506,7 +125506,7 @@ PrefabInstance:
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
propertyPath: m_LocalPosition.y
value: -4.9154644
value: -4.6154644
objectReference: {fileID: 0}
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
@ -125864,7 +125864,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 4520396350849616, guid: 7d60c822c3f1b408ea7a00ecdb5e047a, type: 3}
propertyPath: m_LocalPosition.y
value: 0.5000000
value: 0.8000000
objectReference: {fileID: 0}
- target: {fileID: 4520396350849616, guid: 7d60c822c3f1b408ea7a00ecdb5e047a, type: 3}
propertyPath: m_LocalPosition.z
@ -133748,7 +133748,7 @@ PrefabInstance:
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
propertyPath: m_LocalPosition.y
value: 4.3145354
value: 4.6145354
objectReference: {fileID: 0}
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
@ -137743,7 +137743,7 @@ PrefabInstance:
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
propertyPath: m_LocalPosition.y
value: -1.3354645
value: -1.0354645
objectReference: {fileID: 0}
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
@ -137836,7 +137836,7 @@ PrefabInstance:
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
propertyPath: m_LocalPosition.y
value: -6.4954643
value: -6.1954643
objectReference: {fileID: 0}
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
@ -140571,7 +140571,7 @@ PrefabInstance:
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
propertyPath: m_LocalPosition.y
value: -4.4654640
value: -4.1654640
objectReference: {fileID: 0}
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
@ -296270,7 +296270,7 @@ PrefabInstance:
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
propertyPath: m_LocalPosition.y
value: -5.7054644
value: -5.4054644
objectReference: {fileID: 0}
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
@ -297389,7 +297389,7 @@ PrefabInstance:
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
propertyPath: m_LocalPosition.y
value: -4.8454640
value: -4.5454640
objectReference: {fileID: 0}
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
@ -311611,7 +311611,7 @@ PrefabInstance:
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
propertyPath: m_LocalPosition.y
value: -0.1254645
value: 0.1745355
objectReference: {fileID: 0}
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
@ -314947,7 +314947,7 @@ PrefabInstance:
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
propertyPath: m_LocalPosition.y
value: -1.2554646
value: -0.9554646
objectReference: {fileID: 0}
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
@ -317850,7 +317850,7 @@ PrefabInstance:
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
propertyPath: m_LocalPosition.y
value: -4.9154644
value: -4.6154644
objectReference: {fileID: 0}
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
@ -320806,7 +320806,7 @@ PrefabInstance:
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}
propertyPath: m_LocalPosition.y
value: 0.0845355
value: 0.3845355
objectReference: {fileID: 0}
- target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1,
type: 3}

View File

@ -29,8 +29,7 @@ namespace Platformer.Mechanics
public float cliffCheckDistance = 0.6f; // 발 앞 절벽 검출 거리
public float cliffCheckDepth = 1.5f; // 발 아래 Raycast 거리 (BT81: 0.8→1.5 — 깊게 검출)
public LayerMask groundLayerMask = (1 << 0) | (1 << 16); // BT81: Layer 0 (지면) + Layer 16 (발판) — Enemy/Player 거짓 양성 차단
public float stuckThresholdTime = 0.3f; // 벽 정지 검출 시간 (BT83: 0.5→0.3 — 빠른 영역 전환)
public float wallCheckDistance = 0.5f; // BT83: 수평 벽 Raycast 거리 (벽 가장자리 미세 밀림 차단)
public float stuckThresholdTime = 0.5f; // 벽 정지 검출 시간 (BT85: 0.3→0.5 — 정상 이동 미세 영역 거짓 양성 차단)
private float _startX;
private float _targetX;
@ -132,26 +131,9 @@ namespace Platformer.Mechanics
}
_lastX = transform.position.x;
// BT84 — 수평 벽 검출 정정 (PD 보고 2026-05-08): BT83 거짓 양성 차단
// BT83 시작 영역(bounds 내부)이 Foreground Tile 위에서 옆 Tile 검출 → 거짓 양성 → patrol X
// 정정: Raycast 시작 영역 = Capsule bounds 외부 (자기 검출 X)
if (Mathf.Abs(dx) > patrolArriveThreshold && _collider != null)
{
float halfWidth = _collider.bounds.extents.x;
Vector2 wallOrigin = new Vector2(
_collider.bounds.center.x + moveDir * (halfWidth + 0.05f),
_collider.bounds.center.y
);
RaycastHit2D wallHit = Physics2D.Raycast(wallOrigin, new Vector2(moveDir, 0), wallCheckDistance, groundLayerMask);
if (wallHit.collider != null)
{
_patrolPhase = (_patrolPhase + 1) % 4;
SetNextPatrolTarget();
dx = _targetX - transform.position.x;
moveDir = Mathf.Sign(dx);
_stuckTimer = 0f;
}
}
// BT85 — 수평 벽 Raycast 영역 폐기 (PD 보고 2026-05-08: 모든 Enemy 정지)
// BT83/BT84 영역 = bounds 외부+0.5m 영역도 옆 Tile (평지 인접) 검출 → 거짓 양성 → patrol X
// 정정: 수평 Raycast 폐기 + stuckTimer 영역 0.5초 (BT81 영역 회복) — 벽 정지 시 다음 phase
// 절벽 검출 — 발 앞 영역 Raycast 지면 X 시 시작 위치로 즉시 복귀
if (Mathf.Abs(dx) > patrolArriveThreshold && _collider != null)