Files
zeling_v2/Assets/_Game/Scripts/Feedback/WeaponFeedback.cs
T
joywayerandClaude Fable 5 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

67 lines
2.8 KiB
C#

using UnityEngine;
using MoreMountains.Feedbacks;
namespace BaseGames.Feedback
{
/// <summary>
/// 武器反馈组件,挂载在武器 HitBox Prefab 根节点上。
/// 实现 IFeedbackPlayer,专注于武器本地反馈(命中粒子、击打音效、破风等)。
/// 角色级别的全局反馈(震屏、手柄振动)仍由 PlayerFeedback 负责。
/// </summary>
public class WeaponFeedback : 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.HitPoint;
[Header("攻击破风")]
[SerializeField] private MMF_Player _onAttackWhoosh;
[Header("通用命名预设")]
[SerializeField] private NamedFeedbackPreset[] _namedPresets;
[System.Serializable]
private struct NamedFeedbackPreset
{
public string presetId;
public MMF_Player player;
}
// ── IFeedbackPlayer 实现 ──────────────────────────────────────────────
public void PlayHit(HitWeight weight, Vector3 hitPoint)
{
var player = weight switch
{
HitWeight.Light => _onHitLight,
HitWeight.Heavy => _onHitHeavy,
_ => _onHitMedium,
};
FeedbackPlayback.Play(player, _hitPositionMode, hitPoint);
}
public void PlayAttackWhoosh() => _onAttackWhoosh?.PlayFeedbacks();
public void TriggerPreset(string presetId)
{
if (_namedPresets == null) return;
foreach (var p in _namedPresets)
if (p.presetId == presetId) { p.player?.PlayFeedbacks(); return; }
}
// ── 武器上不适用的反馈,空实现 ────────────────────────────────────────
public void PlayParrySuccess() { }
public void PlayTakeHit(Vector3 hitPoint){ }
public void PlayDeath() { }
public void PlayHeal() { }
public void PlayLandImpact() { }
public void PlayJumpLaunch() { }
public void PlayFootstep() { }
public void PlaySFXById(string sfxId) { }
public void PlayFormSwitch(int formIndex){ }
}
}