多轮审查和修复
This commit is contained in:
@@ -5,8 +5,9 @@ using BaseGames.Combat;
|
||||
namespace BaseGames.Audio
|
||||
{
|
||||
/// <summary>
|
||||
/// 订阅战斗/死亡事件,通过 AudioManager 播放对应 SFX。
|
||||
/// 订阅战斗/死亡事件,通过 GlobalSFXPlayer 播放对应 AudioEventSO 音效。
|
||||
/// 挂载在 Persistent 场景的 [Systems] GameObject 上。
|
||||
/// 使用 AudioEventSO 替代裸 AudioClip,支持随机音量 / 音调 / 多片段。
|
||||
/// </summary>
|
||||
public class CombatSFXController : MonoBehaviour
|
||||
{
|
||||
@@ -15,57 +16,52 @@ namespace BaseGames.Audio
|
||||
[SerializeField] private VoidEventChannelSO _onPlayerDied;
|
||||
|
||||
[Header("Default Hit SFX")]
|
||||
[SerializeField] private AudioClip _defaultHitSFX;
|
||||
[SerializeField] private AudioEventSO _defaultHitSFX;
|
||||
|
||||
[Header("Per-Type Hit SFX (optional, overrides default)")]
|
||||
[SerializeField] private AudioClip _sparkHitSFX;
|
||||
[SerializeField] private AudioClip _slashHitSFX;
|
||||
[SerializeField] private AudioClip _bloodHitSFX;
|
||||
[SerializeField] private AudioClip _magicHitSFX;
|
||||
[SerializeField] private AudioClip _heavyHitSFX;
|
||||
[SerializeField] private AudioClip _critHitSFX;
|
||||
[SerializeField] private AudioClip _parryHitSFX;
|
||||
[SerializeField] private AudioClip _fireHitSFX;
|
||||
[SerializeField] private AudioClip _iceHitSFX;
|
||||
[SerializeField] private AudioEventSO _sparkHitSFX;
|
||||
[SerializeField] private AudioEventSO _slashHitSFX;
|
||||
[SerializeField] private AudioEventSO _bloodHitSFX;
|
||||
[SerializeField] private AudioEventSO _magicHitSFX;
|
||||
[SerializeField] private AudioEventSO _heavyHitSFX;
|
||||
[SerializeField] private AudioEventSO _critHitSFX;
|
||||
[SerializeField] private AudioEventSO _parryHitSFX;
|
||||
[SerializeField] private AudioEventSO _fireHitSFX;
|
||||
[SerializeField] private AudioEventSO _iceHitSFX;
|
||||
|
||||
[Header("Death SFX")]
|
||||
[SerializeField] private AudioClip _playerDeathSFX;
|
||||
[SerializeField] private AudioEventSO _playerDeathSFX;
|
||||
|
||||
private readonly CompositeDisposable _subs = new();
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
if (_onHitConfirmed != null)
|
||||
_onHitConfirmed.OnEventRaised += HandleHit;
|
||||
|
||||
if (_onPlayerDied != null)
|
||||
_onPlayerDied.OnEventRaised += HandlePlayerDied;
|
||||
_onHitConfirmed?.Subscribe(HandleHit).AddTo(_subs);
|
||||
_onPlayerDied?.Subscribe(HandlePlayerDied).AddTo(_subs);
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
if (_onHitConfirmed != null)
|
||||
_onHitConfirmed.OnEventRaised -= HandleHit;
|
||||
|
||||
if (_onPlayerDied != null)
|
||||
_onPlayerDied.OnEventRaised -= HandlePlayerDied;
|
||||
_subs.Clear();
|
||||
}
|
||||
|
||||
private void HandleHit(HitInfo info)
|
||||
{
|
||||
AudioClip clip = ResolveHitClip(info.DamageInfo.FxType);
|
||||
if (clip == null) return;
|
||||
AudioEventSO sfx = ResolveHitSFX(info.DamageInfo.FxType);
|
||||
if (sfx == null) return;
|
||||
|
||||
AudioManager.Instance.PlaySFXAtPosition(clip, info.HitPoint);
|
||||
GlobalSFXPlayer.Play(sfx, info.HitPoint);
|
||||
}
|
||||
|
||||
private void HandlePlayerDied()
|
||||
{
|
||||
if (_playerDeathSFX == null) return;
|
||||
AudioManager.Instance.PlaySFX(_playerDeathSFX);
|
||||
GlobalSFXPlayer.Play(_playerDeathSFX);
|
||||
}
|
||||
|
||||
private AudioClip ResolveHitClip(HitFxType fxType)
|
||||
private AudioEventSO ResolveHitSFX(HitFxType fxType)
|
||||
{
|
||||
AudioClip perType = fxType switch
|
||||
AudioEventSO perType = fxType switch
|
||||
{
|
||||
HitFxType.Spark => _sparkHitSFX,
|
||||
HitFxType.Slash => _slashHitSFX,
|
||||
|
||||
Reference in New Issue
Block a user