Files
zeling_v2/Assets/_Game/Scripts/Feedback/PlayerFeedback.cs
2026-05-17 07:56:12 +08:00

114 lines
4.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Collections.Generic;
using UnityEngine;
using MoreMountains.Feedbacks;
namespace BaseGames.Feedback
{
/// <summary>
/// 玩家反馈播放器:实现 IFeedbackPlayer将行为语义映射到 MMF_Player 实例。
/// 挂在玩家 GameObject 上(或子对象 [Feedback] 上)。
/// 所有 MMF_Player 字段均在 Inspector 中配置 Feel 反馈链。
/// </summary>
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;
[SerializeField] private MMF_Player _onFootstep;
[Header("脚步声材质检测")]
[SerializeField] private BaseGames.Audio.FootstepSoundPlayer _footstepSoundPlayer;
[Header("命名预设(可选)")]
[SerializeField] private NamedFeedback[] _namedPresets;
[Header("音效预设(可选)")]
[SerializeField] private NamedFeedback[] _sfxPresets;
private Dictionary<string, MMF_Player> _presetMap;
private Dictionary<string, MMF_Player> _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 PlayFootstep()
{
_onFootstep?.PlayFeedbacks();
_footstepSoundPlayer?.Play();
}
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<string, MMF_Player> BuildMap(NamedFeedback[] entries)
{
var map = new Dictionary<string, MMF_Player>();
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;
}
}