using UnityEngine;
using BaseGames.Combat;
namespace BaseGames.Player
{
///
/// 武器 HitBox 实例。
/// 由 WeaponManager 在切换武器时实例化到角色的 [WeaponSocket] 子节点下,
/// 武器卸下(切换)时销毁。
///
/// Prefab 内部层级示例:
/// [WPN_SkyBlade_HitBox]
/// ├── [HitBox_Ground] ← BoxCollider2D, Layer = PlayerHitBox
/// ├── [HitBox_Up]
/// ├── [HitBox_Down]
/// └── [HitBox_Air]
///
/// 命名规范:Assets/Prefabs/Weapons/WPN_{weaponId}_HitBox.prefab
///
public class WeaponHitBoxInstance : MonoBehaviour
{
[SerializeField] private HitBox _hitBoxGround;
[SerializeField] private HitBox _hitBoxUp;
[SerializeField] private HitBox _hitBoxDown;
[SerializeField] private HitBox _hitBoxAir;
/// 下劈 HitBox 命中确认事件(供 PlayerCombat 转发给 DownAttackState pogo 逻辑)。
public event System.Action OnDownHitConfirmed;
private void Awake()
{
if (_hitBoxDown != null)
_hitBoxDown.OnHitConfirmed += info => OnDownHitConfirmed?.Invoke(info);
}
// ── 公共 API ──────────────────────────────────────────────────────────
/// 激活指定方向的 HitBox。
public void Activate(AttackDirection dir, DamageSourceSO source, Transform attacker)
=> GetHitBox(dir)?.Activate(source, attacker);
/// 停用指定方向的 HitBox。
public void Deactivate(AttackDirection dir)
=> GetHitBox(dir)?.Deactivate();
/// 停用所有方向的 HitBox。
public void DeactivateAll()
{
_hitBoxGround?.Deactivate();
_hitBoxUp?.Deactivate();
_hitBoxDown?.Deactivate();
_hitBoxAir?.Deactivate();
}
/// 切换连击段伤害源(不改变激活状态,供 PlayerCombat.SetComboSegmentSource 调用)。
public void SetDamageSource(AttackDirection dir, DamageSourceSO source)
=> GetHitBox(dir)?.SetDamageSource(source);
/// 按方向查询对应 HitBox 组件。
public HitBox GetHitBox(AttackDirection dir) => dir switch
{
AttackDirection.Ground => _hitBoxGround,
AttackDirection.Up => _hitBoxUp,
AttackDirection.Down => _hitBoxDown,
AttackDirection.Air => _hitBoxAir,
_ => null,
};
}
}