Files
BABA_YAGA/Assets/Scripts/Audio/AudioDatabase.cs

88 lines
2.3 KiB
C#
Raw Normal View History

2026-04-30 17:47:29 +07:00
using System;
using System.Collections.Generic;
2026-06-09 02:05:00 +07:00
using Sirenix.OdinInspector;
2026-04-30 17:47:29 +07:00
using UnityEngine;
using UnityEngine.Audio;
namespace Hallucinate.Audio
{
[Serializable]
public class AudioSample
{
2026-06-09 02:05:00 +07:00
[ValidateInput(nameof(HasName), "Audio sample needs a lookup name.")]
2026-04-30 17:47:29 +07:00
public string Name;
2026-06-09 02:05:00 +07:00
[Required]
2026-04-30 17:47:29 +07:00
public AudioClip Clip;
2026-06-09 02:05:00 +07:00
[PropertyRange(0f, 1f)]
public float DefaultVolume = 1f;
[PropertyRange(0.1f, 3f)]
public float DefaultPitch = 1f;
2026-04-30 17:47:29 +07:00
public AudioMixerGroup MixerGroup;
2026-06-09 02:05:00 +07:00
private bool HasName(string value)
{
return !string.IsNullOrWhiteSpace(value);
}
2026-04-30 17:47:29 +07:00
}
2026-06-08 23:25:33 +07:00
[CreateAssetMenu(fileName = "AudioDatabase", menuName = "BABA_YAGA/Audio/Audio Database")]
2026-04-30 17:47:29 +07:00
public class AudioDatabase : ScriptableObject
{
2026-06-09 02:05:00 +07:00
[Searchable]
[TableList]
2026-04-30 17:47:29 +07:00
[SerializeField] private List<AudioSample> samples = new List<AudioSample>();
2026-06-09 02:05:00 +07:00
[ShowInInspector]
[ReadOnly]
[BoxGroup("Runtime")]
public int SampleCount => samples?.Count ?? 0;
2026-04-30 17:47:29 +07:00
private Dictionary<string, AudioSample> _sampleCache;
2026-06-09 02:05:00 +07:00
[Button("Rebuild Lookup Cache")]
2026-04-30 17:47:29 +07:00
public void Initialize()
{
_sampleCache = new Dictionary<string, AudioSample>();
foreach (var sample in samples)
{
if (!string.IsNullOrEmpty(sample.Name) && !_sampleCache.ContainsKey(sample.Name))
{
_sampleCache.Add(sample.Name, sample);
}
}
}
public AudioSample GetSample(string name)
{
if (_sampleCache == null) Initialize();
if (_sampleCache.TryGetValue(name, out var sample))
{
return sample;
}
return null;
}
2026-06-09 02:05:00 +07:00
public IEnumerable<string> GetSampleNames()
{
foreach (var sample in samples)
{
if (!string.IsNullOrWhiteSpace(sample.Name))
{
yield return sample.Name;
}
}
}
[Button("Log Sample Names")]
private void LogSampleNames()
{
Debug.Log($"{name}: {string.Join(", ", GetSampleNames())}", this);
}
2026-04-30 17:47:29 +07:00
}
}