Files
zeling_v2/Assets/_Game/Scripts/Feedback/IFeedbackPlayer.cs
Joywayer 09bdda970a feat(feedback): 命中/受击反馈支持固定位置与击中位置两种生成模式
DamageInfo 新增运行时字段 HitPoint:HitBox 结算时写入精确接触点
(ClosestPoint),HurtBox.ReceiveDamage 以解析后命中点兜底盖戳,
陷阱/环境等直调路径同样可用。IFeedbackPlayer.PlayHit/PlayTakeHit
增加命中点参数,全链路(武器实例→PlayerCombat→HurtState→
EnemyFeedback)透传。各 Feedback 组件命中/受击槽位新增
FeedbackPositionMode(Fixed=反馈链编排的固定位置 /
HitPoint=传入命中点,启用位置选项的模块在该点生成),由编排
反馈链的开发者在 Inspector 按表现选择;武器命中默认 HitPoint
(火花贴点),角色级默认 Fixed(震屏/振动与位置无关)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 11:48:37 +08:00

115 lines
5.7 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 UnityEngine;
using MoreMountains.Feedbacks;
namespace BaseGames.Feedback
{
/// <summary>
/// 反馈播放器接口:封装所有角色反馈行为,解耦 Character 逻辑与 Feel/MMF_Player 的直接依赖。
/// 由 PlayerFeedback玩家和 EnemyFeedback敌人分别实现
/// NullFeedbackPlayer 用于测试/占位。
/// </summary>
public interface IFeedbackPlayer
{
// ── 命中 ──────────────────────────────────────────────────────────────────
/// <summary>
/// 对目标造成命中时播放对应力度的反馈(摄像机震屏 + 控制器振动等)。
/// hitPoint = 命中点世界坐标DamageInfo.HitPoint
/// 实际生成位置取决于实现方各槽位的 FeedbackPositionMode 配置。
/// </summary>
void PlayHit(HitWeight weight, Vector3 hitPoint);
/// <summary>成功弹反Parry时播放反馈。</summary>
void PlayParrySuccess();
// ── 受伤 / 死亡 ──────────────────────────────────────────────────────────
/// <summary>
/// 角色受到伤害时播放反馈(闪白 + 轻微震屏等)。
/// hitPoint = 受击点世界坐标DamageInfo.HitPoint
/// </summary>
void PlayTakeHit(Vector3 hitPoint);
/// <summary>角色死亡时播放反馈(慢动作 + 震屏 + 音效)。</summary>
void PlayDeath();
// ── 状态恢复 ─────────────────────────────────────────────────────────────
/// <summary>治疗/恢复血量时播放反馈(粒子 + 音效)。</summary>
void PlayHeal();
// ── 移动 / 动作 ──────────────────────────────────────────────────────────
/// <summary>硬着陆时播放地面冲击反馈。</summary>
void PlayLandImpact();
/// <summary>攻击出手时播放破风反馈。</summary>
void PlayAttackWhoosh();
/// <summary>跳跃起跳时播放反馈。</summary>
void PlayJumpLaunch();
/// <summary>脚步音效反馈(行走帧动画事件触发)。</summary>
void PlayFootstep();
// ── 通用 ─────────────────────────────────────────────────────────────────
/// <summary>通过 presetId 触发在 Inspector 中配置的命名预设 MMF_Player。</summary>
void TriggerPreset(string presetId);
/// <summary>通过 sfxId 触发单次音效(不带任何摄像机/振动反馈)。</summary>
void PlaySFXById(string sfxId);
// ── 形态切换 ──────────────────────────────────────────────────────────────
/// <summary>切换到指定形态时播放对应反馈(音效 + 粒子 + 震屏等。formIndex 对应 FormType 枚举值。</summary>
void PlayFormSwitch(int formIndex);
}
/// <summary>命中力度。</summary>
public enum HitWeight { Light, Medium, Heavy }
/// <summary>
/// 反馈生成位置模式。反馈链本身由开发者在 Inspector 编排,
/// 此模式只决定播放时是否把命中点传入反馈链。
/// </summary>
public enum FeedbackPositionMode
{
/// <summary>固定位置:按反馈链各模块编排时设定的位置播放(不传入命中点)。</summary>
Fixed,
/// <summary>击中位置:把命中点传入反馈链,启用了播放位置选项的模块在命中点生成。</summary>
HitPoint,
}
/// <summary>
/// 反馈播放辅助:统一"按位置模式播放 MMF_Player"的实现,供各 IFeedbackPlayer 实现复用。
/// </summary>
public static class FeedbackPlayback
{
/// <summary>按位置模式播放。HitPoint 模式将命中点传给反馈链(仅启用位置选项的模块生效)。</summary>
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();
}
}
/// <summary>
/// 空对象模式实现:所有方法均为空操作,用于测试和不需要反馈的实体。
/// </summary>
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) { }
}
}