53 lines
2.0 KiB
C#
53 lines
2.0 KiB
C#
using UnityEngine;
|
|
using UnityEngine.Audio;
|
|
|
|
namespace BaseGames.Audio
|
|
{
|
|
/// <summary>
|
|
/// 音效事件 ScriptableObject。随机从 Clips 中选取一条播放,
|
|
/// 并在 Volume / Pitch 区间内随机变化,增强音效多样性。
|
|
/// </summary>
|
|
[CreateAssetMenu(menuName = "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());
|
|
}
|
|
}
|
|
}
|