using System.Collections.Generic;
using UnityEngine;
using MoreMountains.Feedbacks;
namespace BaseGames.Feedback
{
///
/// 玩家反馈播放器:实现 IFeedbackPlayer,将行为语义映射到 MMF_Player 实例。
/// 挂在玩家 GameObject 上(或子对象 [Feedback] 上)。
/// 所有 MMF_Player 字段均在 Inspector 中配置 Feel 反馈链。
///
public class PlayerFeedback : MonoBehaviour, IFeedbackPlayer
{
[Header("命中反馈")]
[SerializeField] private MMF_Player _onHitLight;
[SerializeField] private MMF_Player _onHitMedium;
[SerializeField] private MMF_Player _onHitHeavy;
[SerializeField] private MMF_Player _onParrySuccess;
[Header("受伤 / 死亡反馈")]
[SerializeField] private MMF_Player _onTakeHit;
[SerializeField] private MMF_Player _onDeath;
[Header("恢复反馈")]
[SerializeField] private MMF_Player _onHeal;
[Header("移动 / 动作反馈")]
[SerializeField] private MMF_Player _onLandImpact;
[SerializeField] private MMF_Player _onAttackWhoosh;
[SerializeField] private MMF_Player _onJumpLaunch;
[Header("命名预设(可选)")]
[SerializeField] private NamedFeedback[] _namedPresets;
[Header("音效预设(可选)")]
[SerializeField] private NamedFeedback[] _sfxPresets;
private Dictionary _presetMap;
private Dictionary _sfxMap;
private void Awake()
{
_presetMap = BuildMap(_namedPresets);
_sfxMap = BuildMap(_sfxPresets);
}
// ── IFeedbackPlayer ──────────────────────────────────────────────────────
public void PlayHit(HitWeight weight)
{
var player = weight switch
{
HitWeight.Light => _onHitLight,
HitWeight.Medium => _onHitMedium,
HitWeight.Heavy => _onHitHeavy,
_ => _onHitLight,
};
player?.PlayFeedbacks();
}
public void PlayParrySuccess() => _onParrySuccess?.PlayFeedbacks();
public void PlayTakeHit() => _onTakeHit?.PlayFeedbacks();
public void PlayDeath() => _onDeath?.PlayFeedbacks();
public void PlayHeal() => _onHeal?.PlayFeedbacks();
public void PlayLandImpact() => _onLandImpact?.PlayFeedbacks();
public void PlayAttackWhoosh() => _onAttackWhoosh?.PlayFeedbacks();
public void PlayJumpLaunch() => _onJumpLaunch?.PlayFeedbacks();
public void TriggerPreset(string presetId)
{
if (_presetMap.TryGetValue(presetId, out var p))
p?.PlayFeedbacks();
else
Debug.LogWarning($"[PlayerFeedback] 未找到预设 '{presetId}'。");
}
public void PlaySFXById(string sfxId)
{
if (_sfxMap.TryGetValue(sfxId, out var p))
p?.PlayFeedbacks();
else
Debug.LogWarning($"[PlayerFeedback] 未找到 SFX 预设 '{sfxId}'。");
}
// ── 辅助 ─────────────────────────────────────────────────────────────────
private static Dictionary BuildMap(NamedFeedback[] entries)
{
var map = new Dictionary();
if (entries == null) return map;
foreach (var e in entries)
{
if (!string.IsNullOrEmpty(e.id))
map[e.id] = e.player;
}
return map;
}
}
[System.Serializable]
public struct NamedFeedback
{
public string id;
public MMF_Player player;
}
}