Refactor code structure for improved readability and maintainability

This commit is contained in:
2026-05-26 13:04:38 +08:00
parent f74d7f1877
commit 5a0f1548ea
53 changed files with 4853 additions and 163 deletions

View File

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