using UnityEngine; using UnityEngine.Audio; namespace BaseGames.Audio { /// /// 音效事件 ScriptableObject。随机从 Clips 中选取一条播放, /// 并在 Volume / Pitch 区间内随机变化,增强音效多样性。 /// [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); /// 通过已有的 AudioSource 播放(适用于场景内固定位置音效)。 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(); } /// 通过 AudioSource.PlayOneShot 播放(不打断当前音效)。 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()); } } }