diff --git a/Assets/_Game/Scripts/Enemies/Abilities/Configs/RepeatSlamAbilitySO.cs b/Assets/_Game/Scripts/Enemies/Abilities/Configs/RepeatSlamAbilitySO.cs
new file mode 100644
index 00000000..b777d7a4
--- /dev/null
+++ b/Assets/_Game/Scripts/Enemies/Abilities/Configs/RepeatSlamAbilitySO.cs
@@ -0,0 +1,23 @@
+using Animancer;
+using UnityEngine;
+
+namespace BaseGames.Enemies.Abilities
+{
+ /// RepeatSlamAbility 的配置:起手/循环/收招动画 + 砸地行为参数。
+ [CreateAssetMenu(menuName = "BaseGames/Enemies/Abilities/Repeat Slam Ability", fileName = "ABL_")]
+ public class RepeatSlamAbilitySO : EnemyAbilitySO
+ {
+ [Header("动画")]
+ public ClipTransition startClip;
+ public ClipTransition loopClip;
+ public ClipTransition endClip;
+
+ [Header("行为配置")]
+ [Tooltip("每次砸地时 HitBox 激活时长(秒)")]
+ public float hitActiveTime = 0.15f;
+ [Tooltip("砸地次数")]
+ public int slamCount = 2;
+ [Tooltip("最后一次砸地收招后额外等待时间(秒)")]
+ public float staggerDuration = 1.2f;
+ }
+}
diff --git a/Assets/_Game/Scripts/Enemies/Abilities/Configs/RepeatSlamAbilitySO.cs.meta b/Assets/_Game/Scripts/Enemies/Abilities/Configs/RepeatSlamAbilitySO.cs.meta
new file mode 100644
index 00000000..0970183a
--- /dev/null
+++ b/Assets/_Game/Scripts/Enemies/Abilities/Configs/RepeatSlamAbilitySO.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a30689ce0afa0c64cb6f93b9222e1c2c
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Game/Scripts/Enemies/Abilities/RepeatSlamAbility.cs b/Assets/_Game/Scripts/Enemies/Abilities/RepeatSlamAbility.cs
index da1e05e2..03676b45 100644
--- a/Assets/_Game/Scripts/Enemies/Abilities/RepeatSlamAbility.cs
+++ b/Assets/_Game/Scripts/Enemies/Abilities/RepeatSlamAbility.cs
@@ -12,58 +12,55 @@ namespace BaseGames.Enemies.Abilities
///
public class RepeatSlamAbility : EnemyAbilityBase
{
- [Header("动画")]
- [SerializeField] private ClipTransition _startClip;
- [SerializeField] private ClipTransition _loopClip;
- [SerializeField] private ClipTransition _endClip;
-
[Header("打击")]
[SerializeField] private HitBox _hitBox;
- [Header("行为配置")]
- [Tooltip("每次砸地时 HitBox 激活时长(秒)")]
- [SerializeField] private float _hitActiveTime = 0.15f;
- [Tooltip("砸地次数")]
- [SerializeField] private int _slamCount = 2;
- [Tooltip("最后一次砸地收招后额外等待时间(秒)")]
- [SerializeField] private float _staggerDuration = 1.2f;
+ private RepeatSlamAbilitySO _cfg;
+
+ protected override void Awake()
+ {
+ base.Awake();
+ _cfg = ResolveConfig();
+ }
protected override IEnumerator ExecuteCoroutine()
{
+ if (_cfg == null) yield break;
+
Phase = AbilityRunState.Active;
- if (_startClip.Clip != null)
+ if (_cfg.startClip.Clip != null)
{
- _animancer.Play(_startClip);
- yield return EnemyAbilityWaits.Get(_startClip.Clip.length);
+ _animancer.Play(_cfg.startClip);
+ yield return EnemyAbilityWaits.Get(_cfg.startClip.Clip.length);
}
- for (int i = 0; i < _slamCount; i++)
+ for (int i = 0; i < _cfg.slamCount; i++)
{
- if (_loopClip.Clip != null)
+ if (_cfg.loopClip.Clip != null)
{
- _animancer.Play(_loopClip);
- float preHit = Mathf.Max(0f, _loopClip.Clip.length - _hitActiveTime - 0.05f);
+ _animancer.Play(_cfg.loopClip);
+ float preHit = Mathf.Max(0f, _cfg.loopClip.Clip.length - _cfg.hitActiveTime - 0.05f);
yield return EnemyAbilityWaits.Get(preHit);
}
var dmgSrc = _config?.attackSequence?.Length > 0 ? _config.attackSequence[0].damageSource : null;
_hitBox?.Activate(dmgSrc, _transform);
- yield return EnemyAbilityWaits.Get(_hitActiveTime);
+ yield return EnemyAbilityWaits.Get(_cfg.hitActiveTime);
_hitBox?.Deactivate();
- if (i < _slamCount - 1)
+ if (i < _cfg.slamCount - 1)
yield return EnemyAbilityWaits.Get(0.1f);
}
- if (_endClip.Clip != null)
+ if (_cfg.endClip.Clip != null)
{
- _animancer.Play(_endClip);
- yield return EnemyAbilityWaits.Get(_endClip.Clip.length + _staggerDuration);
+ _animancer.Play(_cfg.endClip);
+ yield return EnemyAbilityWaits.Get(_cfg.endClip.Clip.length + _cfg.staggerDuration);
}
else
{
- yield return EnemyAbilityWaits.Get(_staggerDuration);
+ yield return EnemyAbilityWaits.Get(_cfg.staggerDuration);
}
}