Files
zeling_v2/Assets/_Game/Scripts/Audio/AudioEventSO.cs

53 lines
2.0 KiB
C#

using UnityEngine;
using UnityEngine.Audio;
namespace BaseGames.Audio
{
/// <summary>
/// 音效事件 ScriptableObject。随机从 Clips 中选取一条播放,
/// 并在 Volume / Pitch 区间内随机变化,增强音效多样性。
/// </summary>
[CreateAssetMenu(menuName = "BaseGames/Audio/AudioEvent")]
public class AudioEventSO : ScriptableObject
{
[SerializeField] private AudioClip[] _clips;
[SerializeField] private float _volumeMin = 0.9f;
[SerializeField] private float _volumeMax = 1.0f;
[SerializeField] private float _pitchMin = 0.95f;
[SerializeField] private float _pitchMax = 1.05f;
[SerializeField] private AudioMixerGroup _mixerGroup;
public AudioClip PickClip()
{
if (_clips == null || _clips.Length == 0) return null;
return _clips[Random.Range(0, _clips.Length)];
}
public float PickVolume() => Random.Range(_volumeMin, _volumeMax);
/// <summary>通过已有的 AudioSource 播放(适用于场景内固定位置音效)。</summary>
public void Play(AudioSource source)
{
var clip = PickClip();
if (clip == null || source == null) return;
source.clip = clip;
source.volume = PickVolume();
source.pitch = Random.Range(_pitchMin, _pitchMax);
source.outputAudioMixerGroup = _mixerGroup;
source.Play();
}
/// <summary>通过 AudioSource.PlayOneShot 播放(不打断当前音效)。</summary>
public void PlayOneShot(AudioSource source)
{
var clip = PickClip();
if (clip == null || source == null) return;
source.outputAudioMixerGroup = _mixerGroup;
source.pitch = Random.Range(_pitchMin, _pitchMax);
source.PlayOneShot(clip, PickVolume());
}
}
}