/
Lexan97
/
Cowbeat
Обзор
Документация
Войти
/
Lexan97
/
Cowbeat
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Assets/Scripts/Managers/MusicManager.cs
133 строки
4 KB
Lexa97
Final Commit gor present
26 май 2026, 23:40
26 май 2026, 23:40
70e9bdb
Код
Авторство
О чём код?
using UnityEngine; using UnityEngine.SceneManagement; using System.Collections; using System.Collections.Generic; public class MusicManager : MonoBehaviour { public static MusicManager Instance; [Header("Playlists")] public List<AudioClip> menuPlaylist; public List<AudioClip> gamePlaylist; [Header("Settings")] public float fadeDuration = 1.0f; public string menuSceneName = "MainMenu"; // Проверь, чтобы совпадало с твоим названием! private AudioSource sourceA; private AudioSource sourceB; private bool isSourceAPlaying = true; private bool isFading = false; private bool isPlayerDead = false; void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); AudioSource[] sources = GetComponents<AudioSource>(); sourceA = sources[0]; sourceB = sources[1]; // Подписываемся на событие загрузки сцены SceneManager.sceneLoaded += OnSceneLoaded; } else { Destroy(gameObject); } } private void OnDestroy() { // Отписываемся при уничтожении (хороший тон) SceneManager.sceneLoaded -= OnSceneLoaded; } // Этот метод вызывается АВТОМАТИЧЕСКИ при каждой смене сцены private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { isPlayerDead = false; isFading = false; StopAllCoroutines(); if (scene.name == menuSceneName) { PlayRandomFromList(menuPlaylist); } else { PlayRandomFromList(gamePlaylist); } } void Update() { if (isFading || isPlayerDead) return; AudioSource activeSource = isSourceAPlaying ? sourceA : sourceB; if (!activeSource.isPlaying) { // Если музыка затихла сама, включаем следующую из текущей логики bool isInMenu = SceneManager.GetActiveScene().name == menuSceneName; PlayRandomFromList(isInMenu ? menuPlaylist : gamePlaylist); } } public void StopMusicOnDeath() { isPlayerDead = true; StopAllCoroutines(); StartCoroutine(FadeOutCurrent()); } private void PlayRandomFromList(List<AudioClip> list) { if (list == null || list.Count == 0) return; // Выбираем случайный трек AudioClip clip = list[Random.Range(0, list.Count)]; StartCoroutine(FadeToTrack(clip)); } IEnumerator FadeToTrack(AudioClip newClip) { isFading = true; AudioSource active = isSourceAPlaying ? sourceA : sourceB; AudioSource next = isSourceAPlaying ? sourceB : sourceA; next.clip = newClip; next.Play(); float timer = 0; while (timer < fadeDuration) { timer += Time.deltaTime; active.volume = 1 - (timer / fadeDuration); next.volume = timer / fadeDuration; yield return null; } active.Stop(); active.volume = 0; next.volume = 1; isSourceAPlaying = !isSourceAPlaying; isFading = false; } IEnumerator FadeOutCurrent() { AudioSource active = isSourceAPlaying ? sourceA : sourceB; float startVol = active.volume; while (active.volume > 0) { active.volume -= startVol * (Time.deltaTime / fadeDuration); yield return null; } active.Stop(); active.clip = null; } }