using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.Audio; namespace DanroJump.Audio { /// /// Описывает набор клипов и параметры воспроизведения для одного игрового события. /// [Serializable] public sealed class GameAudioClipBinding { [SerializeField] private GameAudioEvent eventId; [SerializeField] private GameAudioChannel channel = GameAudioChannel.Sfx; [SerializeField] private AudioMixerGroup outputGroupOverride; [SerializeField] private AudioClip[] clips = Array.Empty(); [SerializeField] [Range(0f, 1f)] private float volume = 1f; [SerializeField] private Vector2 pitchRange = Vector2.one; [SerializeField] private bool spatial; public GameAudioEvent EventId => eventId; public GameAudioChannel Channel => channel; public AudioMixerGroup OutputGroupOverride => outputGroupOverride; public IReadOnlyList Clips => clips; public float Volume => Mathf.Clamp01(volume); public bool Spatial => spatial; public bool HasClip => clips != null && clips.Length > 0 && clips[0] != null; public float RandomPitch => Mathf.Clamp( UnityEngine.Random.Range(Mathf.Min(pitchRange.x, pitchRange.y), Mathf.Max(pitchRange.x, pitchRange.y)), 0.05f, 3f); public AudioClip GetRandomClip() { if (clips == null || clips.Length == 0) { return null; } var firstValidClip = default(AudioClip); for (var index = 0; index < clips.Length; index++) { if (clips[index] == null) { continue; } firstValidClip ??= clips[index]; } if (firstValidClip == null) { return null; } for (var attempt = 0; attempt < clips.Length; attempt++) { var clip = clips[UnityEngine.Random.Range(0, clips.Length)]; if (clip != null) { return clip; } } return firstValidClip; } } }