#if NO using System.Collections; using System.Collections.Generic; using System.Data.Common; using System.Runtime.CompilerServices; using Unity.VisualScripting; using UnityEngine; using Game; using Music; using Player; using UnityEngine.SceneManagement; namespace Music { /// /// Manages the music tracks and layers for the game. /// Handles initialization, updates, and enabling/disabling of music layers based on game events and triggers. /// public class TrackManager : MonoBehaviour { /// /// The playlist containing the music tracks and layers. /// public Playlist musicTrack; /// /// The prefab used to create audio layers. /// public GameObject layerPrefab; /// /// A list of music layers that persist across scenes. /// private List persistentLayers = new List(); /// /// The currently active scene. /// private Scene currentScene; /// /// Ensures the TrackManager is only active if music is enabled in the GameManager. /// private void Awake() { if (!GameManager.music) { Destroy(gameObject); } } /// /// Initializes the music layers and updates them based on the current scene. /// private void Start() { foreach (var layer in musicTrack.trackLayers) { if (layer.enableTrigger != TrackLayer.EnableTrigger.Scene) { persistentLayers.Add(layer); } } currentScene = GetActiveSceneNotStatistics(); InitializeLayers(); UpdateLayers(musicTrack.trackLayers); } /// /// Checks for scene changes and updates music layers accordingly. /// private void Update() { CheckForRestartability(); if (currentScene != GetActiveSceneNotStatistics()) { currentScene = GetActiveSceneNotStatistics(); UpdateLayers(musicTrack.trackLayers); } if (persistentLayers.Count != 0) UpdateLayers(persistentLayers); } /// /// Creates and initializes audio sources for each music layer. /// private void InitializeLayers() { foreach (TrackLayer layer in musicTrack.trackLayers) { AudioSource layerSource = Instantiate(layerPrefab, transform).GetComponent(); layerSource.gameObject.name = layer.layerName; layerSource.clip = layer.layerTrack; layerSource.volume = 0; try { layerSource.outputAudioMixerGroup = musicTrack.defaultMixer.FindMatchingGroups("Master/" + layer.layerName)[0]; } catch { layerSource.outputAudioMixerGroup = musicTrack.defaultMixer.FindMatchingGroups("Master")[0]; } layerSource.Play(); } } /// /// Updates the state of the specified music layers based on their triggers and conditions. /// /// The list of music layers to update. private void UpdateLayers(List layers) { if (StatisticsManager.PlayerPrefs.GetInt("settingMusic") == 1) { foreach (TrackLayer layer in layers) { DisableLayer(layer); // Handle different enable triggers for the music layers // (e.g., Magnetism, Movement, Toggle, etc.) // Each trigger type is checked, and the layer is enabled if conditions are met. // ... } } } /// /// Restarts audio sources if they have stopped playing. /// private void CheckForRestartability() { bool restart = false; for (int i = 0; i < transform.childCount; i++) { AudioSource child = transform.GetChild(i).GetComponent(); if (child != null && !child.isPlaying) { restart = true; break; } } if (!restart) return; for (int i = 0; i < transform.childCount; i++) { AudioSource child = transform.GetChild(i).GetComponent(); if (child != null) { child.Stop(); child.Play(); } } } /// /// Enables a specific music layer by setting its animator parameter. /// /// The music layer to enable. /// The animator parameter to set (default is "enabled"). private void EnableLayer(TrackLayer layer, string parameter = "enabled") { transform.Find(layer.layerName).GetComponent().SetBool(parameter, true); } /// /// Disables a specific music layer by resetting all its animator parameters. /// /// The music layer to disable. private void DisableLayer(TrackLayer layer) { foreach (AnimatorControllerParameter parameter in transform.Find(layer.layerName).GetComponent().parameters) { transform.Find(layer.layerName).GetComponent().SetBool(parameter.name, false); } } /// /// Gets the currently active scene, excluding the "Statistics Manager Scene". /// /// The active scene. public static Scene GetActiveSceneNotStatistics() { for (int sceneIndex = 0; sceneIndex < SceneManager.sceneCount; sceneIndex++) { if (SceneManager.GetSceneAt(sceneIndex).name != "Statistics Manager Scene") { return SceneManager.GetSceneAt(sceneIndex); } } return SceneManager.GetSceneByBuildIndex(0); } /// /// Stops the music and destroys the TrackManager after a short delay. /// public void Stop() { StartCoroutine(DestroyTrack()); } /// /// Coroutine to destroy the TrackManager after a delay. /// /// An enumerator for the coroutine. public IEnumerator DestroyTrack() { yield return new WaitForSeconds(0.5f); Destroy(gameObject); } } } #endif