Files
bansonic_beta_main/Assets/scripts/UI/Panel_Music/Music_Mgr.cs
T

154 lines
4.5 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Music_Mgr : Singleton_Mono<Music_Mgr>
{
private void OnEnable()
{
SceneManager.sceneLoaded += OnSceneLoaded;
}
private void OnDisable()
{
SceneManager.sceneLoaded -= OnSceneLoaded;
}
private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
// 现在这两个场景是不合规的,需要停止播放
bool isDisallowedScene = scene.name == "Main_main" || scene.name == "gamePlay_gamePlay";
if (isDisallowedScene)
{
// 如果是不合规场景且正在播放,则停止
if (AudioSource != null && AudioSource.isPlaying)
{
AudioSource.Stop();
}
}
else
{
// 如果是合规场景(其他所有场景)且当前没在播放,则尝试播放
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]);
}
}
}
// 切换场景后,如果存在播放器UI,确保其显示正确的数据
if (Music_Cur != null)
{
var players = Object.FindObjectsByType<MusicPlayer>(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> Music_Data_List;
public AudioSource AudioSource;
public Music_Data Music_Cur;
protected override void In_Init()
{
if (TryGetComponent(out AudioSource) == false)
{
AudioSource = gameObject.AddComponent<AudioSource>();
}
StartCoroutine(LoadMusicDataRoutine());
}
private System.Collections.IEnumerator LoadMusicDataRoutine()
{
var rawData = Resources.LoadAll<Music_Data>("Data/Music");
Music_Data_List = new List<Music_Data>();
for (int i = 0; i < rawData.Length; i++)
{
Music_Data_List.Add(rawData[i]);
// Avoid a frame hitch if there are many clips in Resources.
if ((i & 7) == 7) yield return null;
}
if (Music_Data_List.Count > 0)
{
Play(Music_Data_List[0]);
}
yield break;
}
public void Play(Music_Data data)
{
if (data == null) return;
Music_Cur = data;
AudioSource.clip = data.Clip;
AudioSource.Play();
// 刷新所有正在显示的 MusicPlayer UI
var players = Object.FindObjectsByType<MusicPlayer>(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;
}
}