chore: initial commit
This commit is contained in:
104
Assets/Scripts/Feedback/PlayerFeedback.cs
Normal file
104
Assets/Scripts/Feedback/PlayerFeedback.cs
Normal file
@@ -0,0 +1,104 @@
|
||||
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;
|
||||
|
||||
[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 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user