PJ/Assets/scripts/dotfs_scripts/GlobalMusicManager.cs

116 lines
No EOL
3.4 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEngine;
using UnityEngine.Audio; // Обязательно для работы с микшером
[RequireComponent(typeof(AudioSource))]
public class GlobalMusicManager : MonoBehaviour
{
public static GlobalMusicManager Instance { get; private set; }
[Header("Audio Sources")]
[SerializeField] private AudioSource _musicSource;
[SerializeField] private AudioSource _sfxSource; // Отдельный источник для эффектов
[Header("Mixer Settings")]
[SerializeField] private AudioMixer _audioMixer;
[SerializeField] private string _musicParameter = "MusicVolume"; // Имя параметра в микшере
[SerializeField] private string _sfxParameter = "SFXVolume"; // Имя параметра в микшере
private void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
if (_musicSource == null) _musicSource = GetComponent<AudioSource>();
// Если SFX источник не назначен, создадим его или найдем второй
if (_sfxSource == null)
{
_sfxSource = gameObject.AddComponent<AudioSource>();
}
_musicSource.ignoreListenerPause = true;
}
else
{
Destroy(gameObject);
}
}
#region Volume Control
/// <summary>
/// Универсальный метод для установки громкости музыки (для Слайдера 0...1)
/// </summary>
public void SetMusicVolume(float volume)
{
SetMixerVolume(_musicParameter, volume);
}
/// <summary>
/// Универсальный метод для установки громкости SFX (для Слайдера 0...1)
/// </summary>
public void SetSFXVolume(float volume)
{
SetMixerVolume(_sfxParameter, volume);
}
private void SetMixerVolume(string parameterName, float sliderValue)
{
// Ограничиваем значение, чтобы Log10 не выдал ошибку при 0
float volume = Mathf.Clamp(sliderValue, 0.0001f, 1f);
// Формула перевода линейного значения 0..1 в децибелы -80..0
_audioMixer.SetFloat(parameterName, Mathf.Log10(volume) * 20);
}
#endregion
#region Music Logic
public void PlayMusic(AudioClip clip)
{
if (_musicSource == null) return;
if (clip == null)
{
StopMusic();
return;
}
if (_musicSource.clip == clip)
{
if (!_musicSource.isPlaying) _musicSource.Play();
return;
}
_musicSource.clip = clip;
_musicSource.loop = true;
_musicSource.Play();
}
public void StopMusic()
{
if (_musicSource != null)
{
_musicSource.Stop();
_musicSource.clip = null;
}
}
#endregion
#region SFX Logic
/// <summary>
/// Проигрывает звуковой эффект один раз
/// </summary>
public void PlaySFX(AudioClip clip, float pitch = 1f)
{
if (clip == null || _sfxSource == null) return;
_sfxSource.pitch = pitch;
_sfxSource.PlayOneShot(clip);
}
#endregion
}