refactor(enemy): MeleeVulnerability 参数迁入 MeleeVulnerabilityAbilitySO(子类)

This commit is contained in:
2026-07-21 11:32:20 +08:00
parent 34772c3d20
commit 78c8c6dcd6
3 changed files with 45 additions and 15 deletions
@@ -0,0 +1,21 @@
using Animancer;
using UnityEngine;
namespace BaseGames.Enemies.Abilities
{
/// <summary>MeleeVulnerabilityAbility 的配置:攻击动画 + 打击归一化时机 + 后摇脆弱时长。</summary>
[CreateAssetMenu(menuName = "BaseGames/Enemies/Abilities/Melee Vulnerability Ability", fileName = "ABL_")]
public class MeleeVulnerabilityAbilitySO : EnemyAbilitySO
{
[Header("动画")]
public ClipTransition attackClip;
[Header("打击时间(0~1 归一化,基于 Clip 时长)")]
[Range(0f, 1f)] public float hitEnterT = 0.30f;
[Range(0f, 1f)] public float hitExitT = 0.60f;
[Header("后摇脆弱窗口")]
[Tooltip("HurtBox 激活时间(秒)")]
public float staggerDuration = 1.0f;
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e6232abd0bfcd744399d2fcc13db33f2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -12,44 +12,42 @@ namespace BaseGames.Enemies.Abilities
/// </summary> /// </summary>
public class MeleeVulnerabilityAbility : EnemyAbilityBase public class MeleeVulnerabilityAbility : EnemyAbilityBase
{ {
[Header("动画")]
[SerializeField] private ClipTransition _attackClip;
[Header("碰撞")] [Header("碰撞")]
[SerializeField] private HitBox _hitBox; [SerializeField] private HitBox _hitBox;
[SerializeField] private HurtBox _hurtBox; [SerializeField] private HurtBox _hurtBox;
[Header("打击时间(0~1 归一化,基于 Clip 时长)")] private MeleeVulnerabilityAbilitySO _cfg;
[SerializeField, Range(0f, 1f)] private float _hitEnterT = 0.30f;
[SerializeField, Range(0f, 1f)] private float _hitExitT = 0.60f;
[Header("后摇脆弱窗口")] protected override void Awake()
[Tooltip("HurtBox 激活时间(秒)")] {
[SerializeField] private float _staggerDuration = 1.0f; base.Awake();
_cfg = ResolveConfig<MeleeVulnerabilityAbilitySO>();
}
protected override IEnumerator ExecuteCoroutine() protected override IEnumerator ExecuteCoroutine()
{ {
Phase = AbilityRunState.Active; Phase = AbilityRunState.Active;
if (_attackClip.Clip == null) yield break; if (_cfg == null) yield break;
if (_cfg.attackClip.Clip == null) yield break;
float len = _attackClip.Clip.length; float len = _cfg.attackClip.Clip.length;
float t = 0f; float t = 0f;
bool active = false; bool active = false;
var dmgSrc = _config?.attackSequence?.Length > 0 ? _config.attackSequence[0].damageSource : null; var dmgSrc = _config?.attackSequence?.Length > 0 ? _config.attackSequence[0].damageSource : null;
_animancer.Play(_attackClip); _animancer.Play(_cfg.attackClip);
while (t < len) while (t < len)
{ {
t += Time.deltaTime; t += Time.deltaTime;
if (!active && t >= len * _hitEnterT) if (!active && t >= len * _cfg.hitEnterT)
{ {
_hitBox?.Activate(dmgSrc, _transform); _hitBox?.Activate(dmgSrc, _transform);
active = true; active = true;
} }
if (active && t >= len * _hitExitT) if (active && t >= len * _cfg.hitExitT)
{ {
_hitBox?.Deactivate(); _hitBox?.Deactivate();
active = false; active = false;
@@ -65,7 +63,7 @@ namespace BaseGames.Enemies.Abilities
if (_hurtBox != null) if (_hurtBox != null)
_hurtBox.enabled = true; _hurtBox.enabled = true;
yield return EnemyAbilityWaits.Get(_staggerDuration); yield return EnemyAbilityWaits.Get(_cfg.staggerDuration);
if (_hurtBox != null) if (_hurtBox != null)
_hurtBox.enabled = false; _hurtBox.enabled = false;