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) { }
}
}