using UnityEngine; using MoreMountains.Feedbacks; using BaseGames.Combat; using BaseGames.Feedback; namespace BaseGames.Enemies { /// /// 敌人反馈播放器:实现 IFeedbackPlayer,将行为语义映射到 MMF_Player 实例。 /// 同时保留 OnHit/OnDeath 语义方法供 EnemyBase 直接调用(转发给接口方法)。 /// public class EnemyFeedback : MonoBehaviour, IFeedbackPlayer { [Header("命中反馈")] [SerializeField] private MMF_Player _onHitLight; [SerializeField] private MMF_Player _onHitMedium; [SerializeField] private MMF_Player _onHitHeavy; [Tooltip("命中反馈生成位置:Fixed = 反馈链编排的固定位置;HitPoint = 在命中点生成")] [SerializeField] private FeedbackPositionMode _hitPositionMode = FeedbackPositionMode.Fixed; [Header("受伤 / 死亡反馈")] [SerializeField] private MMF_Player _onTakeHit; [Tooltip("受击反馈生成位置:Fixed = 反馈链编排的固定位置;HitPoint = 在受击点生成(血粒子等贴点表现)")] [SerializeField] private FeedbackPositionMode _takeHitPositionMode = FeedbackPositionMode.Fixed; [SerializeField] private MMF_Player _onDeath; // ── IFeedbackPlayer ────────────────────────────────────────────────────── public void PlayHit(HitWeight weight, Vector3 hitPoint) { var player = weight switch { HitWeight.Light => _onHitLight, HitWeight.Medium => _onHitMedium, HitWeight.Heavy => _onHitHeavy, _ => _onHitLight, }; FeedbackPlayback.Play(player, _hitPositionMode, hitPoint); } public void PlayTakeHit(Vector3 hitPoint) => FeedbackPlayback.Play(_onTakeHit, _takeHitPositionMode, hitPoint); public void PlayDeath() => _onDeath?.PlayFeedbacks(); // 以下方法对敌人无意义,提供空实现保持接口完整 public void PlayParrySuccess() { } public void PlayHeal() { } public void PlayLandImpact() { } public void PlayAttackWhoosh() { } public void PlayJumpLaunch() { } public void PlayFootstep() { } public void TriggerPreset(string presetId) { } public void PlaySFXById(string sfxId) { } public void PlayFormSwitch(int formIndex) { } // 敌人无形态切换,空实现 // ── EnemyBase 语义方法 ──────────────────────────────────────────── /// 受到伤害时调用(由 EnemyBase 触发)。 public void OnHit(DamageInfo info) { PlayTakeHit(info.HitPoint); } /// 死亡时调用(由 EnemyBase 触发)。 public void OnDeath() { PlayDeath(); } } }