using System.Collections;
using Animancer;
using BaseGames.Combat;
using UnityEngine;
namespace BaseGames.Enemies.Abilities
{
///
/// 近战攻击带后摇脆弱窗口能力:攻击动画期间按时间比例激活 HitBox,
/// 攻击完成后开放 HurtBox(脆弱窗口),窗口结束后恢复正常。
/// 可复用于任何"攻击后有反击窗口"的敌人技能。
///
public class MeleeVulnerabilityAbility : EnemyAbilityBase
{
[Header("碰撞")]
[SerializeField] private HitBox _hitBox;
[SerializeField] private HurtBox _hurtBox;
private MeleeVulnerabilityAbilitySO _cfg;
protected override void Awake()
{
base.Awake();
_cfg = ResolveConfig();
}
protected override IEnumerator ExecuteCoroutine()
{
Phase = AbilityRunState.Active;
if (_cfg == null) yield break;
if (_cfg.attackClip.Clip == null) yield break;
float len = _cfg.attackClip.Clip.length;
float t = 0f;
bool active = false;
var dmgSrc = _config?.attackSequence?.Length > 0 ? _config.attackSequence[0].damageSource : null;
_animancer.Play(_cfg.attackClip);
while (t < len)
{
t += Time.deltaTime;
if (!active && t >= len * _cfg.hitEnterT)
{
_hitBox?.Activate(dmgSrc, _transform);
active = true;
}
if (active && t >= len * _cfg.hitExitT)
{
_hitBox?.Deactivate();
active = false;
}
yield return null;
}
if (active)
_hitBox?.Deactivate();
// 后摇脆弱窗口
if (_hurtBox != null)
_hurtBox.enabled = true;
yield return EnemyAbilityWaits.Get(_cfg.staggerDuration);
if (_hurtBox != null)
_hurtBox.enabled = false;
}
protected override void OnInterrupted(InterruptReason reason)
{
_hitBox?.Deactivate();
if (_hurtBox != null)
_hurtBox.enabled = false;
}
}
}