using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.SceneManagement; public class Music_Mgr : Singleton_Mono { private const string MainSceneName = "Main_main"; private const string GameplaySceneName = "gamePlay_gamePlay"; private void OnEnable() { SceneManager.sceneLoaded += OnSceneLoaded; ApplyScenePlaybackPolicy(SceneManager.GetActiveScene()); } private void OnDisable() { SceneManager.sceneLoaded -= OnSceneLoaded; StopMusicPlayback(); } protected override void OnDestroy() { StopMusicPlayback(); base.OnDestroy(); } private void OnApplicationQuit() { StopMusicPlayback(); } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { ApplyScenePlaybackPolicy(scene); if (Music_Cur != null) { var players = Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None); foreach (var player in players) { player.Refresh(Music_Cur); } } } public static string Get_Time_Max(AudioClip clip) { return Get_Time(clip == null ? 0 : (int)clip.length); } public static string Get_Time_Cur(AudioSource aus) { return Get_Time((int)aus.time); } private static System.Text.StringBuilder _timeSb = new System.Text.StringBuilder(); public static string Get_Time(int time) { var currentHour = time / 3600; var currentMinute = (time - currentHour * 3600) / 60; var currentSecond = time - currentHour * 3600 - currentMinute * 60; _timeSb.Clear(); if (currentHour > 0) { _timeSb.Append(currentHour.ToString("D2")).Append(":"); } _timeSb.Append(currentMinute.ToString("D2")).Append(":").Append(currentSecond.ToString("D2")).Append(" "); return _timeSb.ToString(); } public static float Get_Time_Cur_Prv(AudioSource aus) { return aus.time / aus.clip.length; } public List Music_Data_List; public AudioSource AudioSource; public Music_Data Music_Cur; protected override void In_Init() { if (TryGetComponent(out AudioSource) == false) { AudioSource = gameObject.AddComponent(); } StartCoroutine(LoadMusicDataRoutine()); } private System.Collections.IEnumerator LoadMusicDataRoutine() { var rawData = Resources.LoadAll("Data/Music"); Music_Data_List = new List(); for (int i = 0; i < rawData.Length; i++) { Music_Data_List.Add(rawData[i]); if ((i & 7) == 7) yield return null; } if (Music_Data_List.Count > 0) { ApplyScenePlaybackPolicy(SceneManager.GetActiveScene()); } yield break; } public void Play(Music_Data data) { if (data == null) return; Music_Cur = data; if (!ShouldPlayInScene(SceneManager.GetActiveScene().name)) { StopMusicPlayback(); return; } if (TryPlayThroughBgmManager(data, true)) { StopMusicPlayback(); RefreshPlayers(data); return; } AudioSource.clip = data.Clip; AudioSource.Play(); RefreshPlayers(data); } private void RefreshPlayers(Music_Data data) { var players = Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None); foreach (var player in players) { player.Refresh(data); } } public void Next() { if (Music_Data_List == null || Music_Data_List.Count == 0) return; int index = Music_Data_List.IndexOf(Music_Cur); index = (index + 1) % Music_Data_List.Count; Play(Music_Data_List[index]); } public void Last() { if (Music_Data_List == null || Music_Data_List.Count == 0) return; int index = Music_Data_List.IndexOf(Music_Cur); index = (index - 1 + Music_Data_List.Count) % Music_Data_List.Count; Play(Music_Data_List[index]); } protected override bool Is_Singleton_Auto() { return true; } private bool ShouldPlayInScene(string sceneName) { if (string.IsNullOrEmpty(sceneName)) { return false; } return !string.Equals(sceneName, MainSceneName, System.StringComparison.OrdinalIgnoreCase) && !string.Equals(sceneName, GameplaySceneName, System.StringComparison.OrdinalIgnoreCase); } private void ApplyScenePlaybackPolicy(Scene scene) { if (!scene.IsValid() || !scene.isLoaded) { StopMusicPlayback(); return; } if (!ShouldPlayInScene(scene.name)) { StopMusicPlayback(); return; } if (Music_Cur == null && Music_Data_List != null && Music_Data_List.Count > 0) { Music_Cur = Music_Data_List[0]; } if (Music_Cur != null && TryPlayThroughBgmManager(Music_Cur, false)) { StopMusicPlayback(); RefreshPlayers(Music_Cur); return; } if (AudioSource != null && !AudioSource.isPlaying) { if (Music_Cur != null) { AudioSource.Play(); } else if (Music_Data_List != null && Music_Data_List.Count > 0) { Play(Music_Data_List[0]); } } } private void StopMusicPlayback() { if (AudioSource != null && AudioSource.isPlaying) { AudioSource.Stop(); } } private bool TryPlayThroughBgmManager(Music_Data data, bool restart) { if (data == null || data.Clip == null) { return false; } BgmPlaybackManager bgm = BgmPlaybackManager.Instance; if (bgm == null) { return false; } bgm.PlayExternalClip(data.Clip, restart); return true; } }