refactor(enemy): Appear/FacePlayer/PlayClip 参数迁入各自子类 SO

This commit is contained in:
2026-07-21 11:35:39 +08:00
parent 78c8c6dcd6
commit 6d071e83ae
9 changed files with 99 additions and 12 deletions
@@ -10,15 +10,21 @@ namespace BaseGames.Enemies.Abilities
/// </summary>
public class AppearAbility : EnemyAbilityBase
{
[SerializeField] private ClipTransition _appearClip;
private AppearAbilitySO _cfg;
protected override void Awake()
{
base.Awake();
_cfg = ResolveConfig<AppearAbilitySO>();
}
protected override IEnumerator ExecuteCoroutine()
{
Phase = AbilityRunState.Active;
if (_appearClip.Clip == null) yield break;
if (_cfg == null || _cfg.appearClip.Clip == null) yield break;
_animancer.Play(_appearClip);
yield return EnemyAbilityWaits.Get(_appearClip.Clip.length);
_animancer.Play(_cfg.appearClip);
yield return EnemyAbilityWaits.Get(_cfg.appearClip.Clip.length);
}
}
}
@@ -0,0 +1,12 @@
using Animancer;
using UnityEngine;
namespace BaseGames.Enemies.Abilities
{
/// <summary>AppearAbility 的配置:出场动画。</summary>
[CreateAssetMenu(menuName = "BaseGames/Enemies/Abilities/Appear Ability", fileName = "ABL_")]
public class AppearAbilitySO : EnemyAbilitySO
{
public ClipTransition appearClip;
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 73e9c01905c405d4ea9e4c04ca7886fa
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,12 @@
using Animancer;
using UnityEngine;
namespace BaseGames.Enemies.Abilities
{
/// <summary>FacePlayerAbility 的配置:转身/翻转动画。</summary>
[CreateAssetMenu(menuName = "BaseGames/Enemies/Abilities/Face Player Ability", fileName = "ABL_")]
public class FacePlayerAbilitySO : EnemyAbilitySO
{
public ClipTransition faceClip;
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: cb259f910bbefb342b91080d8a091cea
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,12 @@
using Animancer;
using UnityEngine;
namespace BaseGames.Enemies.Abilities
{
/// <summary>PlayClipAbility 的配置:待播放的单个动画 Clip。</summary>
[CreateAssetMenu(menuName = "BaseGames/Enemies/Abilities/Play Clip Ability", fileName = "ABL_")]
public class PlayClipAbilitySO : EnemyAbilitySO
{
public ClipTransition clip;
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: fc81345eb5294d643b4242eac215c5fc
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -12,7 +12,13 @@ namespace BaseGames.Enemies.Abilities
/// </summary>
public class FacePlayerAbility : EnemyAbilityBase
{
[SerializeField] private ClipTransition _faceClip;
private FacePlayerAbilitySO _cfg;
protected override void Awake()
{
base.Awake();
_cfg = ResolveConfig<FacePlayerAbilitySO>();
}
public override bool CanUse =>
base.CanUse
@@ -33,10 +39,10 @@ namespace BaseGames.Enemies.Abilities
_enemy.FacePlayer();
if (_faceClip.Clip == null) yield break;
if (_cfg == null || _cfg.faceClip.Clip == null) yield break;
_animancer.Play(_faceClip);
yield return EnemyAbilityWaits.Get(_faceClip.Clip.length);
_animancer.Play(_cfg.faceClip);
yield return EnemyAbilityWaits.Get(_cfg.faceClip.Clip.length);
}
}
}
@@ -10,15 +10,21 @@ namespace BaseGames.Enemies.Abilities
/// </summary>
public class PlayClipAbility : EnemyAbilityBase
{
[SerializeField] private ClipTransition _clip;
private PlayClipAbilitySO _cfg;
protected override void Awake()
{
base.Awake();
_cfg = ResolveConfig<PlayClipAbilitySO>();
}
protected override IEnumerator ExecuteCoroutine()
{
Phase = AbilityRunState.Active;
if (_clip.Clip == null) yield break;
if (_cfg == null || _cfg.clip.Clip == null) yield break;
_animancer.Play(_clip);
yield return EnemyAbilityWaits.Get(_clip.Clip.length);
_animancer.Play(_cfg.clip);
yield return EnemyAbilityWaits.Get(_cfg.clip.Clip.length);
}
}
}