NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Audio/AlbumManager.cs

578 lines
15 KiB
C#
Raw Normal View History

2024-07-04 16:32:27 +08:00
using cfg.ActorCfg;
2024-07-05 18:25:44 +08:00
using cfg.AudioCfg;
using Cysharp.Threading.Tasks;
2024-07-04 16:32:27 +08:00
using Framework;
using PhxhSDK;
using System.Collections.Generic;
using System.Linq;
public class AlbumManager : Singlenton<AlbumManager>
{
public enum PlayMode
{
Order,
Random,
Single
}
PlayMode curPlayMode = PlayMode.Order;
public PlayMode CurPlayMode => curPlayMode;
List<int> playOrderList = new();
private int curOrderIndex = 0;
bool initialized = false;
public string curMusicKey;
Dictionary<int, DataAlbum> albumDic = new Dictionary<int, DataAlbum>();
List<DataAlbum> albumList = new List<DataAlbum>();
public readonly bool loadFromLocal = true;
AlbumLocalData _saveData;
public Timer playTimer = new();
void loadOrInit()
{
if(!initialized)
{
Init();
initialized = true;
2024-07-05 18:25:44 +08:00
playTimer.onPlayEnd += NextAudio;
2024-07-04 16:32:27 +08:00
}
}
public void Init()
{
albumDic.Clear();
var albumCfg = TableManager.Instance.Tables.AlbumConfig;
foreach (var item in albumCfg.DataList)
{
albumDic.Add(item.Id, item);
albumList.Add(item);
}
if (loadFromLocal)
{
_saveData = StorageMgr.Instance.GetStorage<AlbumLocalData>("ALBUM_LOCAL_DATA");
if (_saveData == null)
{
_saveData = new AlbumLocalData();
}
2024-07-09 16:56:40 +08:00
//if (AlbumUnlocked(_saveData.curAlbumId))//<2F><EFBFBD><E7B1A3><EFBFBD><EFBFBD>ר<EFBFBD><D7A8>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2>ŵ<EFBFBD>һ<EFBFBD><D2BB>ר<EFBFBD><D7A8>
//{
// _saveData.curAlbumId = 1;
// _saveData.curPlayAudioIndex = 0;
//}
//if (_saveData.themeAlbumID != 0 && AlbumUnlocked(_saveData.themeAlbumID))//<2F><EFBFBD><E7B1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ר<EFBFBD><D7A8>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ר<EFBFBD><D7A8>
//{
// _saveData.themeAlbumID = 0;
//}
2024-07-04 16:32:27 +08:00
curPlayMode = (PlayMode)_saveData.curOrderMode;
SetPlayMode(curPlayMode);
2024-07-05 18:25:44 +08:00
SetPlayList();
2024-07-04 16:32:27 +08:00
var curAudio = CurPlayAudio();
if (curAudio != null)
{
curMusicKey = curAudio.Key;
}
else
{
DebugUtil.LogError("CurAudio is null");
}
}
else
{
//TODO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD>
}
}
public void Release()
{
albumDic.Clear();
albumList.Clear();
}
public Dictionary<int, DataAlbum> AlbumsDic => albumDic;
public List<DataAlbum> AlbumsLst => albumList;
public bool AlbumUnlocked(int albumId)
{
loadOrInit();
if(albumDic.ContainsKey(albumId))
{
if (albumDic[albumId].DefaultUnlock)//Ĭ<>Ͻ<EFBFBD><CFBD><EFBFBD>ר<EFBFBD><D7A8>
{
return true;
}
else
{
int itemID = albumDic[albumId].ItemID;
if (CategoryManager.Instance.GetItemCount(itemID) > 0)
{
return true;
}
else
{
return false;
}
}
}
else
{
//int ItemID=
DebugUtil.LogError(albumId + " not found in album config");
return false;
}
}
2024-07-05 18:25:44 +08:00
public List<cfg.item.ItemCounts> AlbumUnlockCost(int albumId)
{
if (albumDic.ContainsKey(albumId))
{
return albumDic[albumId].CostItems;
}
else
{
DebugUtil.LogError(albumId + " not found in album config");
return null;
}
}
/// <summary>
/// <20><>ǰר<C7B0><D7A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
2024-07-04 16:32:27 +08:00
public DataAlbum GetCurAlbum()
{
loadOrInit();
if (loadFromLocal)
{
loadSaveData();
//if (_saveData == null)
//{
// _saveData = StorageMgr.Instance.GetStorage<AlbumLocalData>("ALBUM_LOCAL_DATA");
// if (_saveData != null && _saveData.curAlbumId > 0)
// {
// if (AlbumUnlocked(_saveData.curAlbumId))//<2F><EFBFBD><E7B1A3><EFBFBD><EFBFBD>ר<EFBFBD><D7A8>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2>ŵ<EFBFBD>һ<EFBFBD><D2BB>ר<EFBFBD><D7A8>
// {
// SetCurAlbum(1, 0);
// }
// return albumDic[_saveData.curAlbumId];
// }
// else
// {
// return albumList[0];
// }
//}
//else
//{
2024-07-04 16:32:27 +08:00
return albumDic[_saveData.curAlbumId];
//}
2024-07-04 16:32:27 +08:00
}
else
{
DebugUtil.Log("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ");
return null;
//TODO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD>
}
}
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ר<EFBFBD><D7A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns></returns>
2024-07-04 16:32:27 +08:00
public int GetCurAudioIndex()
{
loadOrInit();
loadSaveData();
2024-07-04 16:32:27 +08:00
return _saveData.curPlayAudioIndex;
}
/// <summary>
/// <20><><EFBFBD>õ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ŵ<EFBFBD>ר<EFBFBD><D7A8>
/// </summary>
/// <param name="albumId"></param>
/// <param name="audioIndex"></param>
2024-07-04 16:32:27 +08:00
public void SetCurAlbum(int albumId, int audioIndex)
{
loadOrInit();
if (albumDic.ContainsKey(albumId))
{
loadSaveData();
2024-07-04 16:32:27 +08:00
_saveData.curAlbumId = albumId;
_saveData.curPlayAudioIndex = audioIndex;
StorageMgr.Instance.SyncForce = true;
}
else
{
DebugUtil.LogError(albumId + " not found in album config");
}
}
/// <summary>
/// <20><>Ϊbgm<67><6D><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD>ר<EFBFBD><D7A8>
/// </summary>
/// <returns></returns>
public int GetCurThemeAlbum()
{
loadOrInit();
loadSaveData();
return _saveData.themeAlbumID;
}
public void SetCurThemeAlbum(int albumId)
{
loadOrInit();
loadSaveData();
if (albumDic.ContainsKey(albumId))
{
_saveData.themeAlbumID = albumId;
}
else//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ר<EFBFBD><D7A8>
{
_saveData.themeAlbumID = 0;
}
StorageMgr.Instance.SyncForce = true;
}
2024-07-04 16:32:27 +08:00
/// <summary>
/// ר<><D7A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
/// </summary>
/// <returns></returns>
public List<int> AlbumPlayList(int albumID)
{
if(albumDic.ContainsKey(albumID))
{
return albumDic[albumID].PlayList.ToList();
}
else
{
DebugUtil.LogError(albumID + " not found in album config");
return null;
}
}
public List<int> CurAlbumPlayList()
{
loadSaveData();
2024-07-04 16:32:27 +08:00
return AlbumPlayList(_saveData.curAlbumId);
}
public DataAudio CurPlayAudio()
{
loadSaveData();
2024-07-04 16:32:27 +08:00
var playList = CurAlbumPlayList();
if (playList != null && playList.Count > 0)
{
return TableManager.Instance.Tables.Audios.GetByID(playList[_saveData.curPlayAudioIndex]);
}
else
{
return null;
}
}
public int CurPlayAudioIndex()
{
loadSaveData();
2024-07-04 16:32:27 +08:00
return _saveData.curPlayAudioIndex;
}
public void SetPlayMode(PlayMode mode)
{
curPlayMode = mode;
2024-07-05 18:25:44 +08:00
SetPlayList();
}
public void SetPlayList()
{
2024-07-04 16:32:27 +08:00
playOrderList.Clear();
loadSaveData();
2024-07-04 16:32:27 +08:00
for (int i = 0; i < AlbumPlayList(_saveData.curAlbumId).Count; i++)
{
playOrderList.Add(i);
}
2024-07-05 18:25:44 +08:00
switch (curPlayMode)
2024-07-04 16:32:27 +08:00
{
case PlayMode.Order:
break;
case PlayMode.Random:
ShuffleOderLst(playOrderList);
for (int i = 0; i < playOrderList.Count; i++)
{
if (playOrderList[i] == _saveData.curPlayAudioIndex)
{
playOrderList.RemoveAt(i);
playOrderList.Insert(0, _saveData.curPlayAudioIndex);
curOrderIndex = 0;
break;
}
}
2024-07-04 16:32:27 +08:00
break;
case PlayMode.Single:
int curIndex = _saveData.curPlayAudioIndex;
for (int i = 0; i < playOrderList.Count; i++)
{
playOrderList[i] = curIndex;
}
break;
default:
break;
}
for (int i = 0; i < playOrderList.Count; i++)
{
if (playOrderList[i] == _saveData.curPlayAudioIndex)
{
curOrderIndex = i;
break;
}
}
}
2024-07-09 15:04:35 +08:00
public bool CheckIsFavor(int audioID)
{
loadSaveData();
2024-07-09 15:04:35 +08:00
return _saveData.FavorAudioLst.Contains(audioID);
}
public void AddFavorAudio(int audio)
{
loadSaveData();
2024-07-09 15:04:35 +08:00
if (!_saveData.FavorAudioLst.Contains(audio))
{
_saveData.FavorAudioLst.Add(audio);
StorageMgr.Instance.SyncForce = true;
}
}
public void RemoveFavorAudio(int audio)
{
loadSaveData();
2024-07-09 15:04:35 +08:00
if (_saveData.FavorAudioLst.Contains(audio))
{
_saveData.FavorAudioLst.Remove(audio);
StorageMgr.Instance.SyncForce = true;
}
}
void ShuffleOderLst(List<int> ts)
2024-07-05 18:25:44 +08:00
{
int favoriteIndex = 0;
2024-07-05 18:25:44 +08:00
for (int i = 0; i < ts.Count; i++)
{
if (CheckIsFavor(AlbumPlayList(_saveData.curAlbumId)[i]))
{
(ts[favoriteIndex], ts[i]) = (ts[i], ts[favoriteIndex]);
favoriteIndex++;
}
}//<2F><>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
for (int i = 0; i < favoriteIndex; i++)
{
int randomIndex = UnityEngine.Random.Range(i, favoriteIndex);
(ts[randomIndex], ts[i]) = (ts[i], ts[randomIndex]);
}//<2F><>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>
for (int i = favoriteIndex; i < ts.Count; i++)
2024-07-05 18:25:44 +08:00
{
int randomIndex = UnityEngine.Random.Range(i, ts.Count);
(ts[randomIndex], ts[i]) = (ts[i], ts[randomIndex]);
}//<2F><><EFBFBD><EFBFBD><EFBFBD>벿<EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>
2024-07-05 18:25:44 +08:00
}
2024-07-04 16:32:27 +08:00
2024-07-11 13:46:58 +08:00
/// <summary>
/// <20><>ר<EFBFBD><D7A8><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>˳<EFBFBD><CBB3>
/// </summary>
/// <param name="albumID"></param>
/// <param name="audioIndex"></param>
2024-07-04 16:32:27 +08:00
public async void PlayAlbumAudio(int albumID, int audioIndex)
{
if (albumDic.ContainsKey(albumID))
{
var playList = AlbumPlayList(albumID);
if (playList != null && playList.Count > 0)
{
if (audioIndex >= playList.Count)
{
audioIndex = 0;
}
await AudioManager.Instance.PlayAlbum(playList[audioIndex]);
curMusicKey = TableManager.Instance.Tables.Audios.GetByID(playList[audioIndex]).Key;
SetCurAlbum(albumID, audioIndex);
var totalSeconds = AudioManager.Instance.GetAlbumLength(playList[audioIndex]);
playTimer.Start(totalSeconds);
}
else
{
DebugUtil.LogError("PlayList is empty");
}
}
else
{
DebugUtil.LogError(albumID + " not found in album config");
}
}
public void PlayPreAudio()
{
var playList = CurAlbumPlayList();
if (playList != null && playList.Count > 0)
2024-07-05 18:25:44 +08:00
{
if (curPlayMode == PlayMode.Single)
{
curOrderIndex = _saveData.curPlayAudioIndex;
}
2024-07-04 16:32:27 +08:00
curOrderIndex--;
if (curOrderIndex < 0)
{
curOrderIndex = playList.Count - 1;
}
2024-07-05 18:25:44 +08:00
if (curPlayMode == PlayMode.Single)
{
for (int i = 0; i < playOrderList.Count; i++)
{
playOrderList[i] = curOrderIndex;
}
curOrderIndex = 0;
}
2024-07-04 16:32:27 +08:00
PlayAlbumAudio(GetCurAlbum().Id, playOrderList[curOrderIndex]);
}
}
public void PlayNextAudio()
{
var playList = CurAlbumPlayList();
if (playList != null && playList.Count > 0)
2024-07-05 18:25:44 +08:00
{
if (curPlayMode == PlayMode.Single)
{
curOrderIndex = _saveData.curPlayAudioIndex;
}
curOrderIndex++;
if (curOrderIndex >= playList.Count)
{
curOrderIndex = 0;
}
if (curPlayMode == PlayMode.Single)
{
for (int i = 0; i < playOrderList.Count; i++)
{
playOrderList[i] = curOrderIndex;
}
curOrderIndex = 0;
}
PlayAlbumAudio(GetCurAlbum().Id, playOrderList[curOrderIndex]);
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɻص<C9BB>
/// </summary>
public void NextAudio()
{
var playList = CurAlbumPlayList();
if (playList != null && playList.Count > 0)
2024-07-04 16:32:27 +08:00
{
curOrderIndex++;
if (curOrderIndex >= playList.Count)
{
curOrderIndex = 0;
}
PlayAlbumAudio(GetCurAlbum().Id, playOrderList[curOrderIndex]);
}
}
/// <summary>
/// <20><><EFBFBD>Ž<EFBFBD><C5BD>ȼ<EFBFBD>ʱ<EFBFBD><CAB1>
/// </summary>
public class Timer
{
bool isPlaying;
float audioLength = -1;
public delegate void OnSecondChange();
public event OnSecondChange onSecondChange;
public delegate void OnPlayEnd();
public event OnPlayEnd onPlayEnd;
async UniTask AudioTimer()
{
while (isPlaying)
{
float totalSeconds = AudioManager.Instance.GetAlbumProgress();
if (totalSeconds < 0)
{
isPlaying = false;
break;
}
if (totalSeconds >= audioLength && audioLength > 0)
{
isPlaying = false;
//AudioManager.Instance.StopMusicById(CurPlayAudio().ID);
onPlayEnd?.Invoke();
break;
}
onSecondChange?.Invoke();
await UniTask.Delay(100);//0.1s
}
}
public void Start(float audiolen)
{
audioLength = audiolen;
2024-07-09 16:56:40 +08:00
if (audiolen <= 0)
{
DebugUtil.LogWarning("<22><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD><C7B8>´<EFBFBD><C2B4><EFBFBD>");
}
2024-07-04 16:32:27 +08:00
if (isPlaying)
{
return;
}
isPlaying = true;
AudioTimer().Forget();
}
public void Start()
{
if (isPlaying)
{
return;
}
isPlaying = true;
AudioTimer().Forget();
}
public void Stop()
{
isPlaying = false;
}
}
/// <summary>
/// _saveDataδ<61><CEB4>ȡʱ<C8A1>Ĵ<EFBFBD><C4B4><EFBFBD>
/// </summary>
void loadSaveData()
{
if (_saveData == null)
{
_saveData = StorageMgr.Instance.GetStorage<AlbumLocalData>("ALBUM_LOCAL_DATA");
if (AlbumUnlocked(_saveData.curAlbumId))//<2F><EFBFBD><E7B1A3><EFBFBD><EFBFBD>ר<EFBFBD><D7A8>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2>ŵ<EFBFBD>һ<EFBFBD><D2BB>ר<EFBFBD><D7A8>
{
SetCurAlbum(1, 0);
}
if (_saveData.themeAlbumID != 0 && AlbumUnlocked(_saveData.themeAlbumID))//<2F><EFBFBD><E7B1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ר<EFBFBD><D7A8>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ר<EFBFBD><D7A8>
{
SetCurThemeAlbum(0);
}
}
}
2024-07-04 16:32:27 +08:00
}
public class AlbumLocalData
{
public int curAlbumId = 1;
public int curPlayAudioIndex = 0;
public int curOrderMode = 0;
public int themeAlbumID = 0;//<2F><><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾû<CABE><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ר<EFBFBD><D7A8>
2024-07-09 15:04:35 +08:00
public List<int> FavorAudioLst = new List<int>();
2024-07-04 16:32:27 +08:00
}