2026-05-19 무기추가
진행중인 사항 - InputManager + .inputactions: WeaponSlot1/2/3 액션 추가, 키 1/2/3 매핑 PlayerController 통합: Player에 PlayerWeaponInventory 컴포넌트 자동 부착 OnWeaponChanged 구독 → idle/walk State 이름 동적 교체 OnPunchInput 분기: 무장 시 weapon.AttackRootNode 사용 WeaponSlot 입력 핸들러 3개 추가 (EquipUnarmed / EquipSlot(0) / EquipSlot(1))
This commit is contained in:
@@ -20,7 +20,11 @@ public class AttackHitbox : MonoBehaviour
|
||||
// PlayerController가 구독해서 "방금 hit한 적" 추적용 (잡기 타겟 우선 등에 활용).
|
||||
public event System.Action<IDamageable> OnHit;
|
||||
|
||||
private CircleCollider2D _collider;
|
||||
private CircleCollider2D _circleCollider; // Circle 모양 판정용
|
||||
private BoxCollider2D _boxCollider; // Box 모양 판정용 (Awake에서 자동 생성)
|
||||
private HitShape _activeShape; // 현재 활성 도형 (ScanImmediateOverlap에서 분기)
|
||||
private float _activeRadius; // Circle일 때 사용하는 반경 (스캔/Gizmo용 백업)
|
||||
private Vector2 _activeHitSize; // Box일 때 사용하는 크기 백업
|
||||
|
||||
// ─── 현재 활성 액션의 데미지/효과 데이터 (Activate에서 세팅) ─────────
|
||||
private int _damage;
|
||||
@@ -39,18 +43,43 @@ public class AttackHitbox : MonoBehaviour
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
_collider = GetComponent<CircleCollider2D>();
|
||||
// 플레이어 몸체는 적과 물리 충돌하지 않으므로, 공격 판정은 이 트리거만 사용한다.
|
||||
_collider.isTrigger = true;
|
||||
_collider.enabled = false;
|
||||
_circleCollider = GetComponent<CircleCollider2D>();
|
||||
// 플레이어 몸체는 적과 물리 충돌하지 않으므로, 공격 판정은 트리거만 사용.
|
||||
_circleCollider.isTrigger = true;
|
||||
_circleCollider.enabled = false;
|
||||
|
||||
// BoxCollider2D는 없으면 자동 추가. 기존 프리팹과의 호환성 유지.
|
||||
_boxCollider = GetComponent<BoxCollider2D>();
|
||||
if (_boxCollider == null)
|
||||
_boxCollider = gameObject.AddComponent<BoxCollider2D>();
|
||||
_boxCollider.isTrigger = true;
|
||||
_boxCollider.enabled = false;
|
||||
}
|
||||
|
||||
// 액션 시작 시 호출. 위치/반경/데미지 등 모든 파라미터 세팅 후 콜라이더 활성화.
|
||||
// 액션 시작 시 호출. 도형/위치/데미지 세팅 후 해당 콜라이더만 활성화.
|
||||
// _alreadyHit를 클리어해서 새 공격으로 다시 hit 가능하게 함.
|
||||
public void Activate(ActionData data, Vector2 localPosition, Vector2 hitVelocity, Vector2 sourcePosition, Vector2? hitTargetPosition, bool correctHitTargetY, int hitPositionSolidMask, LayerMask targetLayer)
|
||||
{
|
||||
transform.localPosition = localPosition;
|
||||
_collider.radius = data.Radius;
|
||||
|
||||
// 도형에 맞는 콜라이더만 활성화. 다른 도형 콜라이더는 비활성으로 보장.
|
||||
_activeShape = data.Shape;
|
||||
if (data.Shape == HitShape.Box)
|
||||
{
|
||||
_boxCollider.size = data.HitSize;
|
||||
_boxCollider.offset = Vector2.zero;
|
||||
_boxCollider.enabled = true;
|
||||
_circleCollider.enabled = false;
|
||||
_activeHitSize = data.HitSize;
|
||||
}
|
||||
else
|
||||
{
|
||||
_circleCollider.radius = data.Radius;
|
||||
_circleCollider.enabled = true;
|
||||
_boxCollider.enabled = false;
|
||||
_activeRadius = data.Radius;
|
||||
}
|
||||
|
||||
_damage = data.Damage;
|
||||
_hitVelocity = hitVelocity;
|
||||
_hitSourcePosition = sourcePosition;
|
||||
@@ -62,24 +91,27 @@ public void Activate(ActionData data, Vector2 localPosition, Vector2 hitVelocity
|
||||
_hitReactionState = data.HitReactionAnimationState;
|
||||
_targetLayer = targetLayer;
|
||||
_alreadyHit.Clear();
|
||||
_collider.enabled = true;
|
||||
|
||||
// 판정이 켜진 순간 이미 범위 안에 있던 적도 같은 프레임에 잡아낸다.
|
||||
ScanImmediateOverlap();
|
||||
}
|
||||
|
||||
// 액션의 HitDuration이 끝나면 호출. 콜라이더 비활성화 + hit 기록 초기화.
|
||||
// 액션의 HitDuration이 끝나면 호출. 모든 콜라이더 비활성화 + hit 기록 초기화.
|
||||
public void Deactivate()
|
||||
{
|
||||
_collider.enabled = false;
|
||||
_circleCollider.enabled = false;
|
||||
_boxCollider.enabled = false;
|
||||
_alreadyHit.Clear();
|
||||
}
|
||||
|
||||
// 활성 순간 즉시 검사: Physics2D.OverlapCircleAll로 현재 겹친 콜라이더를 모두 가져와 TryDamage.
|
||||
// 활성 순간 즉시 검사: 도형에 맞는 OverlapAll로 현재 겹친 콜라이더를 모두 가져와 TryDamage.
|
||||
// 이게 없으면 짧은 hit window (예: HitDuration=0.02)에 OnTriggerEnter가 못 따라옴.
|
||||
private void ScanImmediateOverlap()
|
||||
{
|
||||
Collider2D[] hits = Physics2D.OverlapCircleAll(transform.position, _collider.radius, _targetLayer);
|
||||
Collider2D[] hits = _activeShape == HitShape.Box
|
||||
? Physics2D.OverlapBoxAll(transform.position, _activeHitSize, 0f, _targetLayer)
|
||||
: Physics2D.OverlapCircleAll(transform.position, _activeRadius, _targetLayer);
|
||||
|
||||
foreach (var hit in hits)
|
||||
TryDamage(hit);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user