243 lines
6.1 KiB
C#
243 lines
6.1 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
using UnityEngine.SceneManagement;
|
|
|
|
public class Music_Mgr : Singleton_Mono<Music_Mgr>
|
|
{
|
|
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<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]);
|
|
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<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;
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|