using cfg.AudioCfg; using Cysharp.Threading.Tasks; using Framework; using Gameplay; using Gameplay.Common; using Gameplay.Net; using PhxhSDK; using System.Threading; using TMPro; using UnityEngine; using UnityEngine.UIElements; using Button = UnityEngine.UI.Button; using Image = UnityEngine.UI.Image; public class UI_MusicPannelController : UIWindow { #region UI_Obj //UI GameObj ///Auto Gen Start/// public Image Image_CurrentAlbum; public Image Image_Dd; public Image Image_Rd; public Image Image_Top; public Image Image_Ld; public Image Image_LD; public Image Image_CDbox; public Image Image_CDB; public Image Image_CD; //public Button Button_Back; public Button Button_back; public TMP_Text Text_Back; public Button Button_Home; public Button Button_Left; public Button Button_Right; public Image Image_DBG; public Image Image_RightBg; public Image Image_ChooseBar; public TMP_Text Text_Num_Choose; public TMP_Text Text_MusicName_Choose; public Image Image_Play; public Image Image_Pause; public TMP_Text Text_Author_Choose; public Image Image_NotChoose; public TMP_Text Text_Num_NotChoose; public TMP_Text Text_MusicName_NotChoose; public TMP_Text Text_Author_NotChoose; public Image Image_EmptyH; public Image Image_Heart; public Image Image_PlayBg; public Image Image_DownPoint; public Image Image_Analysis1; public Image Image_Analysis2; public Image Image_Analysis3; public Image Image_Analysis4; public Image Image_Analysis5; public Image Image_Analysis6; public Image Image_Analysis7; public Image Image_Analysis8; public Image Image_Analysis9; public Image Image_Analysis10; public Image Image_Analysis11; public Image Image_Analysis12; public Image Image_Analysis13; public Image Image_Analysis14; public Image Image_Analysis15; public Image Image_Analysis16; public Image Image_MusicRect; public Image Image_Logo; public Image Image_ProcessBg; public Image Image_ProcessNow; public TMP_Text Text_TimeNow; public TMP_Text Text_AllTime; public Image Image_PL; public TMP_Text Text_Play; public Image Image_PA; public TMP_Text Text_Pause; public Image Image_Lbg; public Button Button_Previous; public TMP_Text Text_Previous; public Button Button_PlayAndPause; public TMP_Text Text_PP; public Image Image_circle; public Button Button_Next; public TMP_Text Text_Next; public Image Image_Seperate; public Image Image_Rbg; public Button Button_Seq; public Image Image_CSeq; public TMP_Text Text_Sequence; public Button Button_Shu; public Image Image_CShu; public TMP_Text Text_Shuffle; public Button Button_Rep; public Image Image_CRep; public TMP_Text Text_Repeat; public Button Button_Set; public TMP_Text Text_Set; public Button Button_Lock; public TMP_Text Text_LockButton; public Button Button_Seted; public TMP_Text Text_Seted; public Button Button_UnLock; public TMP_Text Text_Unlock; public TMP_Text Text_SpendLocalText; public TMP_Text Text_Spend; public TMP_Text Text_SpecialLock; public Image Image_CoinLogo; public Image Image_DiamondLogo; public Image Image_MusicNameBG; public TMP_Text Text_Name; public TMP_Text Text_Name2; public TMP_Text Text_Lock; ///Auto Gen End/// #endregion PhxhScrollView AlbumPageScrollView; PhxhScrollView AudioListScrollView; /// /// 频谱分析数组 /// private float[] spectrums; MusicDance musicDance; AlbumCoverFader coverFader; float curAudioLength = 0f; int curAlbumIndex = 0; public static async UniTask Open() { await CommonUtils.CaptureScreenshot(); return await UIManager.Instance.CreateAndOpenWindow(UINameConst.UI_MusicPanel); } private void _OnClickClose() { CloseWindow(); } // deal with input data public override void PreLoad(object data = null) { } // Use this for initialization public override void OnInit() { //bind UI GameObj UI_MusicPannelBinder.GetComponents(this); AlbumPageScrollView = GetComponent("PhxhScrollView"); AudioListScrollView = GetComponent("Image_RightBg/PhxhScrollView"); musicDance = new(FindObj("Image_RightBg/Image_PlayBg/Music/MusicAnalyzers")); BindButton(Button_back, _OnClickClose); if (AlbumManager.Instance.GetCurThemeAlbum() == 0)//未设置主题专辑在播放默认bgm { DebugUtil.Log("pause music"); AudioManager.Instance.PauseBackgroundMusic(); } BindButton(Button_PlayAndPause, PauseAndResume); BindButton(Button_Left, preAlbum); BindButton(Button_Right, nextAlbum); BindButton(Button_Previous, preMusic); BindButton(Button_Next, nextMusic); BindButton(Button_Seq, () => { SwitchPlayMode(AlbumManager.PlayMode.Order); }); BindButton(Button_Shu, () => { SwitchPlayMode(AlbumManager.PlayMode.Random); }); BindButton(Button_Rep, () => { SwitchPlayMode(AlbumManager.PlayMode.Single); }); BindButton(Button_UnLock, OnUnlockAlbumClick); BindButton(Button_Set, OnSetThemeAlbumClick); BindButton(Button_Seted, ClearThemeAlbum); coverFader = new(Image_CDB, Image_CD); curAlbumIndex = AlbumManager.Instance.GetCurAlbum().Id; AlbumPageScrollView.SetItemCountFunc(() => AlbumManager.Instance.AlbumsLst.Count); AlbumPageScrollView.SetUpdateFunc(AlbumPageRefreshFunc); AlbumPageScrollView.itemTemplate.gameObject.SetActive(false); AlbumPageScrollView.UpdateData(); AudioListScrollView.SetItemCountFunc(() => AlbumManager.Instance.AlbumsDic[curAlbumIndex].PlayList.Length); AudioListScrollView.SetUpdateFunc(AlbumListRefreshFunc); AudioListScrollView.itemTemplate.gameObject.SetActive(false); AudioListScrollView.UpdateData(); CDPagesImage(curAlbumIndex, true); CheckLock(); RefreshPlayOrder(); AlbumManager.Instance.playTimer.onSecondChange += TimerRefresh; AlbumManager.Instance.playTimer.onPlayEnd += PlayEndRefresh; EventManager.Instance.Register(EventManager.EventName.ItemChange, OnItemChange); } //invoke when open window protected override void OnShowWindow(object data = null) { //bool isPlaying = AudioManager.Instance.IsPlayingAlbum; PauseAndResume(); //if (!isPlaying) //{ PauseAndResume();//用于加载音频 //} curAudioLength = AlbumManager.Instance.GetAlbumLength(AlbumManager.Instance.curMusicKey); float totalSeconds = AlbumManager.Instance.GetAlbumProgress(); DebugUtil.Log(AlbumManager.Instance.curMusicKey + "当前已播放时长:" + totalSeconds); int minutes = Mathf.FloorToInt(totalSeconds / 60F); int seconds = Mathf.FloorToInt(totalSeconds - minutes * 60); Text_TimeNow.text = $"{minutes:00}:{seconds:00}"; if (curAudioLength > 0) { minutes = Mathf.FloorToInt(curAudioLength / 60F); seconds = Mathf.FloorToInt(curAudioLength - minutes * 60); Text_AllTime.text = $"{minutes:00}:{seconds:00}"; Image_ProcessNow.fillAmount = totalSeconds / curAudioLength; } } //invoke when reload window protected override void OnReloadWindow(object data = null) { } //invoke when close window protected override void OnHideWindow() { } //invoke when destroy public override void OnRelease() { base.OnRelease(); if (AlbumManager.Instance.GetCurThemeAlbum() == 0)//未设置主题专辑 { DebugUtil.Log("resume music"); if (AudioManager.Instance.IsPlayingAlbum) PauseAndResume(); AudioManager.Instance.ResumeBackgroundMusic(); //AudioManager.Instance.PlayAudio("NLD_BGM_02").Forget(); AudioManager.Instance.PlayAudio("bgm_2", AudioCriManager.EPlayType.Music); } else if (AlbumManager.Instance.GetCurThemeAlbum() != AlbumManager.Instance.GetCurAlbum().Id)//设置主题专辑但与当前播放不一致 { AlbumManager.Instance.SetCurAlbum(AlbumManager.Instance.GetCurThemeAlbum(), AlbumManager.Instance.GetCurThemeAudioIndex()); int curAlbumIndex = AlbumManager.Instance.GetCurThemeAlbum(); int curAudioIndex = AlbumManager.Instance.CurPlayAudioIndex(); if (!AudioManager.Instance.IsPlayingAlbum) PauseAndResume(); AlbumManager.Instance.PlayAlbumAudio(curAlbumIndex, curAudioIndex); AlbumManager.Instance.SetPlayList(); } AlbumManager.Instance.playTimer.onSecondChange -= TimerRefresh; AlbumManager.Instance.playTimer.onPlayEnd -= PlayEndRefresh; EventManager.Instance.Unregister(EventManager.EventName.ItemChange, OnItemChange); } #region button_click void preAlbum() { //AlbumManager.Instance.PreAlbum(); //CDPagesImage(AlbumManager.Instance.GetCurAlbum().Id); curAlbumIndex--; if (curAlbumIndex <= 0) { curAlbumIndex = AlbumManager.Instance.AlbumsLst.Count; } CDPagesImage(curAlbumIndex); CheckLock(); AudioListScrollView.UpdateData(); } void nextAlbum() { curAlbumIndex++; if (curAlbumIndex > AlbumManager.Instance.AlbumsLst.Count) { curAlbumIndex = 1; } CDPagesImage(curAlbumIndex); CheckLock(); AudioListScrollView.UpdateData(); } void preMusic() { AlbumManager.Instance.PlayPreAudio(); PlayEndRefresh(); } void nextMusic() { AlbumManager.Instance.PlayNextAudio(); PlayEndRefresh(); } void SwitchPlayMode(AlbumManager.PlayMode playMode) { if (playMode != AlbumManager.Instance.CurPlayMode) AlbumManager.Instance.SetPlayMode(playMode); RefreshPlayOrder(); } void PauseAndResume() { AudioManager.Instance.IsPlayingAlbum = !AudioManager.Instance.IsPlayingAlbum; if (AudioManager.Instance.IsPlayingAlbum) { if (!AlbumManager.Instance.PauseAndResumeAlbum(false))//未播放 { //await AudioManager.Instance.PlayAlbum(dataAudio.ID); //AlbumManager.Instance.curMusicKey = dataAudio.Key; //albumTimer.Start(Text_TimeNow, Image_ProcessNow, totalSeconds); int curAudioIndex = AlbumManager.Instance.CurPlayAudioIndex(); AlbumManager.Instance.PlayAlbumAudio(curAlbumIndex, curAudioIndex); AlbumManager.Instance.SetPlayList();//SetPlayMode(AlbumManager.Instance.CurPlayMode); curAudioLength = -1;//AlbumManager.Instance.GetAlbumLength(AlbumManager.Instance.CurPlayAudio().Key); int minutes = Mathf.FloorToInt(curAudioLength / 60F); int seconds = Mathf.FloorToInt(curAudioLength - minutes * 60); Text_AllTime.text = $"{minutes:00}:{seconds:00}"; } //else//从暂停中恢复 //{ // albumTimer.Start(Text_TimeNow); //} Image_PL.gameObject.SetActive(true); Image_PA.gameObject.SetActive(false); } else { //albumTimer.Stop(); AlbumManager.Instance.PauseAndResumeAlbum(true); Image_PL.gameObject.SetActive(false); Image_PA.gameObject.SetActive(true); } } void OnPlayListClick(int index) { AudioManager.Instance.IsPlayingAlbum = true; //AlbumManager.Instance.SetCurAlbum(curAlbumIndex, index); AlbumManager.Instance.PauseAndResumeAlbum(false); AlbumManager.Instance.PlayAlbumAudio(curAlbumIndex, index); AlbumManager.Instance.SetPlayList();//SetPlayMode(AlbumManager.Instance.CurPlayMode);//TODO 播放模式 if (AlbumManager.Instance.GetPlayListContentType(curAlbumIndex) == typeof(int[]))//过时方法 { DataAudio dataAudio = TableManager.Instance.Tables.Audios.GetByID(AlbumManager.Instance.AlbumPlayListOld(curAlbumIndex)[index]); AlbumManager.Instance.curMusicKey = dataAudio.Key; DebugUtil.Log("cur music key: " + dataAudio.Key); curAudioLength = AlbumManager.Instance.GetAlbumLength(dataAudio.Key); } else { var playName = AlbumManager.Instance.AlbumPlayList(curAlbumIndex)[index]; AlbumManager.Instance.curMusicKey = playName; curAudioLength = AlbumManager.Instance.GetAlbumLength(playName); } int minutes = Mathf.FloorToInt(curAudioLength / 60F); int seconds = Mathf.FloorToInt(curAudioLength - minutes * 60); Text_AllTime.text = $"{minutes:00}:{seconds:00}"; Image_PL.gameObject.SetActive(true); Image_PA.gameObject.SetActive(false); PlayEndRefresh(); } void OnUnlockAlbumClick() { var cost = AlbumManager.Instance.AlbumUnlockCost(curAlbumIndex); if (cost.Count > 0) { if (CategoryManager.Instance.GetItemCount(cost[0].Id) < cost[0].Count) { DebugUtil.LogError("货币不足!"); CommonUtils.ShowMessageTips(CommonUtils.GetLocalizeText("shop_noMoney")); return; } else { NetHelper.BuyAlbum((uint)curAlbumIndex);//(uint)AlbumManager.Instance.AlbumsDic[].ItemID } } else { DebugUtil.LogError("未配置解锁消耗道具!"); return; } } void OnSetThemeAlbumClick() { DebugUtil.Log("当前专辑ID:" + curAlbumIndex); if (curAlbumIndex != AlbumManager.Instance.GetCurThemeAlbum()) { AlbumManager.Instance.SetCurThemeAlbum(curAlbumIndex); Button_Seted.gameObject.SetActive(true); } else { AlbumManager.Instance.SetCurThemeAlbum(0); Button_Seted.gameObject.SetActive(false); } } void ClearThemeAlbum() { AlbumManager.Instance.SetCurThemeAlbum(0); Button_Seted.gameObject.SetActive(false); } #endregion #region album_page_SV void AlbumPageRefreshFunc(int index,RectTransform rt) { rt.gameObject.SetActive(true); int ID = index + 1; SetPageImage(rt.GetComponent(), ID); } async void SetPageImage(Image img, int index) { var path = "Assets/Art/UI/Texture/Icon/MusicBox/" + AlbumManager.Instance.AlbumsDic[index].CoverPath + ".png"; var sprite = await LoadAssetAsync(path); img.sprite = sprite; } #endregion #region album_list_SV void AlbumListRefreshFunc(int index, RectTransform rt) { rt.gameObject.SetActive(true); string audioName; if (AlbumManager.Instance.GetPlayListContentType(curAlbumIndex) == typeof(string[])) { audioName = AlbumManager.Instance.AlbumPlayList(curAlbumIndex)[index]; } else//过时方法 { var audioLst = AlbumManager.Instance.AlbumPlayListOld(curAlbumIndex); if (audioLst == null) { DebugUtil.LogError("album list is null"); return; } var audioID = audioLst[index]; DataAudio audioCfg = TableManager.Instance.Tables.Audios.GetByID(audioID);//.GetConfigData(audioID); audioName = audioCfg.CueName; } int id = index + 1; rt.Find("Image_ChooseBar/Text_Num_Choose").GetComponent().text = $"{id:00}"; rt.Find("Image_NotChoose/Text_Num_NotChoose").GetComponent().text = $"{id:00}"; if (curAlbumIndex == AlbumManager.Instance.GetCurAlbum().Id && index == AlbumManager.Instance.GetCurAudioIndex())//当前播放 { rt.Find("Image_NotChoose").gameObject.SetActive(false); rt.Find("Image_ChooseBar").gameObject.SetActive(true); var musicName = rt.Find("Image_ChooseBar/Text_MusicName_Choose").gameObject; var authorName = rt.Find("Image_ChooseBar/Text_Author_Choose").gameObject; if (musicName != null) { musicName.GetComponent().text = audioName; } //if (authorName != null) //{ // authorName.GetComponent().text = audioCfg.Artist; //} rt.Find("Image_ChooseBar/Text_MusicName_Choose/Image_Pause").gameObject.SetActive(!AudioManager.Instance.IsPlayingAlbum); rt.Find("Image_ChooseBar/Text_MusicName_Choose/Image_Play").gameObject.SetActive(AudioManager.Instance.IsPlayingAlbum); ClearBind(rt.Find("Image_ChooseBar").GetComponent