using UnityEngine;
using MoreMountains.Feedbacks;
using BaseGames.Combat;
using BaseGames.Feedback;
namespace BaseGames.Enemies
{
///
/// 敌人反馈播放器:实现 IFeedbackPlayer,将行为语义映射到 MMF_Player 实例。
/// 同时保留 OnHit/OnDeath 语义方法供 EnemyBase 直接调用(转发给接口方法)。
///
public class EnemyFeedback : MonoBehaviour, IFeedbackPlayer
{
[Header("命中反馈")]
[SerializeField] private MMF_Player _onHitLight;
[SerializeField] private MMF_Player _onHitMedium;
[SerializeField] private MMF_Player _onHitHeavy;
[Tooltip("命中反馈生成位置:Fixed = 反馈链编排的固定位置;HitPoint = 在命中点生成")]
[SerializeField] private FeedbackPositionMode _hitPositionMode = FeedbackPositionMode.Fixed;
[Header("受伤 / 死亡反馈")]
[SerializeField] private MMF_Player _onTakeHit;
[Tooltip("受击反馈生成位置:Fixed = 反馈链编排的固定位置;HitPoint = 在受击点生成(血粒子等贴点表现)")]
[SerializeField] private FeedbackPositionMode _takeHitPositionMode = FeedbackPositionMode.Fixed;
[SerializeField] private MMF_Player _onDeath;
// ── IFeedbackPlayer ──────────────────────────────────────────────────────
public void PlayHit(HitWeight weight, Vector3 hitPoint)
{
var player = weight switch
{
HitWeight.Light => _onHitLight,
HitWeight.Medium => _onHitMedium,
HitWeight.Heavy => _onHitHeavy,
_ => _onHitLight,
};
FeedbackPlayback.Play(player, _hitPositionMode, hitPoint);
}
public void PlayTakeHit(Vector3 hitPoint)
=> FeedbackPlayback.Play(_onTakeHit, _takeHitPositionMode, hitPoint);
public void PlayDeath() => _onDeath?.PlayFeedbacks();
// 以下方法对敌人无意义,提供空实现保持接口完整
public void PlayParrySuccess() { }
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) { } // 敌人无形态切换,空实现
// ── EnemyBase 语义方法 ────────────────────────────────────────────
/// 受到伤害时调用(由 EnemyBase 触发)。
public void OnHit(DamageInfo info)
{
PlayTakeHit(info.HitPoint);
}
/// 死亡时调用(由 EnemyBase 触发)。
public void OnDeath()
{
PlayDeath();
}
}
}