using UnityEngine; using MoreMountains.Feedbacks; namespace BaseGames.Feedback { /// /// 反馈播放器接口:封装所有角色反馈行为,解耦 Character 逻辑与 Feel/MMF_Player 的直接依赖。 /// 由 PlayerFeedback(玩家)和 EnemyFeedback(敌人)分别实现; /// NullFeedbackPlayer 用于测试/占位。 /// public interface IFeedbackPlayer { // ── 命中 ────────────────────────────────────────────────────────────────── /// /// 对目标造成命中时播放对应力度的反馈(摄像机震屏 + 控制器振动等)。 /// hitPoint = 命中点世界坐标(DamageInfo.HitPoint); /// 实际生成位置取决于实现方各槽位的 FeedbackPositionMode 配置。 /// void PlayHit(HitWeight weight, Vector3 hitPoint); /// 成功弹反(Parry)时播放反馈。 void PlayParrySuccess(); // ── 受伤 / 死亡 ────────────────────────────────────────────────────────── /// /// 角色受到伤害时播放反馈(闪白 + 轻微震屏等)。 /// hitPoint = 受击点世界坐标(DamageInfo.HitPoint)。 /// void PlayTakeHit(Vector3 hitPoint); /// 角色死亡时播放反馈(慢动作 + 震屏 + 音效)。 void PlayDeath(); // ── 状态恢复 ───────────────────────────────────────────────────────────── /// 治疗/恢复血量时播放反馈(粒子 + 音效)。 void PlayHeal(); // ── 移动 / 动作 ────────────────────────────────────────────────────────── /// 硬着陆时播放地面冲击反馈。 void PlayLandImpact(); /// 攻击出手时播放破风反馈。 void PlayAttackWhoosh(); /// 跳跃起跳时播放反馈。 void PlayJumpLaunch(); /// 脚步音效反馈(行走帧动画事件触发)。 void PlayFootstep(); // ── 通用 ───────────────────────────────────────────────────────────────── /// 通过 presetId 触发在 Inspector 中配置的命名预设 MMF_Player。 void TriggerPreset(string presetId); /// 通过 sfxId 触发单次音效(不带任何摄像机/振动反馈)。 void PlaySFXById(string sfxId); // ── 形态切换 ────────────────────────────────────────────────────────────── /// 切换到指定形态时播放对应反馈(音效 + 粒子 + 震屏等)。formIndex 对应 FormType 枚举值。 void PlayFormSwitch(int formIndex); } /// 命中力度。 public enum HitWeight { Light, Medium, Heavy } /// /// 反馈生成位置模式。反馈链本身由开发者在 Inspector 编排, /// 此模式只决定播放时是否把命中点传入反馈链。 /// public enum FeedbackPositionMode { /// 固定位置:按反馈链各模块编排时设定的位置播放(不传入命中点)。 Fixed, /// 击中位置:把命中点传入反馈链,启用了播放位置选项的模块在命中点生成。 HitPoint, } /// /// 反馈播放辅助:统一"按位置模式播放 MMF_Player"的实现,供各 IFeedbackPlayer 实现复用。 /// public static class FeedbackPlayback { /// 按位置模式播放。HitPoint 模式将命中点传给反馈链(仅启用位置选项的模块生效)。 public static void Play(MMF_Player player, FeedbackPositionMode mode, Vector3 hitPoint) { if (player == null) return; if (mode == FeedbackPositionMode.HitPoint) player.PlayFeedbacks(hitPoint); else player.PlayFeedbacks(); } } /// /// 空对象模式实现:所有方法均为空操作,用于测试和不需要反馈的实体。 /// public class NullFeedbackPlayer : IFeedbackPlayer { public static readonly NullFeedbackPlayer Instance = new NullFeedbackPlayer(); public void PlayHit(HitWeight weight, Vector3 hitPoint) { } public void PlayParrySuccess() { } public void PlayTakeHit(Vector3 hitPoint) { } public void PlayDeath() { } 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) { } } }