Files
zeling_v2/Assets/_Game/Scripts/Feedback/WeaponFeedback.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

67 lines
2.8 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>
/// 武器反馈组件,挂载在武器 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){ }
}
}