using System; using System.Collections; using System.Collections.Generic; using System.Linq; using DG.Tweening; using Ichni.RhythmGame; using Sirenix.OdinInspector; using SLSUtilities.WwiseAssistance; using TMPro; using UnityEngine; using UnityEngine.UI; namespace Ichni.Menu { public partial class DifficultySelectionButton : MonoBehaviour { private DifficultySelectionContainer container => MenuManager.instance.songSelectionUIPage.difficultySelectionContainer; public Button button; public DifficultyData difficultyData; public TMP_Text difficultyValueText; public TMP_Text difficultyNameText; public Sprite selectedSprite; public Sprite unselectedSprite; [Title("Parts")] public Image background; public Image innerRing; public Image outerRing; public Image star; public Image upperLeftCorner; public Image lowerLeftCorner; private void Start() { button.onClick.AddListener(Select); } } public partial class DifficultySelectionButton { public void SetUp(DifficultyData difficulty) { gameObject.SetActive(difficulty.isAvailable); this.difficultyData = difficulty; difficultyValueText.text = difficulty.difficultyValue.ToString(); difficultyNameText.text = difficulty.GetDifficultyName(); } public void Select() { MenuManager.instance.songSelectionUIPage.selectedDifficulty = difficultyData; MenuManager.instance.songSelectionUIPage.songInfoUI.SetCharter(difficultyData.charterName); if (MenuManager.instance.songSelectionUIPage.selectedSave.TryGetBeatmapSave( difficultyData.saveDifficultyId, out BeatmapSave beatmapSave)) { MenuManager.instance.songSelectionUIPage.songInfoUI.SetBeatmapInfo(beatmapSave); } else { // 当前内容尚未创建该难度的记录时,UI 只显示空成绩,不在展示路径修改存档。 MenuManager.instance.songSelectionUIPage.songInfoUI.SetBeatmapInfo(new BeatmapSave(0f, false, false)); } MenuInformationRecorder.instance.SetRecordForChapter( ChapterSelectionManager.instance.currentChapter, MenuManager.instance.songSelectionUIPage.selectedSong, MenuManager.instance.songSelectionUIPage.selectedSong.difficultyDataList.IndexOf(difficultyData)); if (container.selectedButton == this) { background.DOColor(difficultyData.color, 0.4f).SetEase(Ease.OutQuart).Play(); return; } MenuManager.instance.songSelectionUIPage.difficultySelectionContainer.selectedButton?.Deselect(); MenuManager.instance.songSelectionUIPage.difficultySelectionContainer.selectedButton = this; AudioManager.Post(AK.EVENTS.SELECTDIFFICULTY); PlaySelectAnimation(); } public void Deselect() { PlayDeselectAnimation(); } } public partial class DifficultySelectionButton { private Sequence selectionSequence; private void PlaySelectAnimation() { selectionSequence?.Kill(true); background.sprite = selectedSprite; selectionSequence = DOTween.Sequence(); selectionSequence.Append(background.rectTransform.DOAnchorPosX(-7.5f, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(background.rectTransform.DOSizeDelta(new Vector2(85, 85), 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(background.DOColor(difficultyData.color, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(innerRing.rectTransform.DOScale(Vector3.one, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(innerRing.rectTransform.DOLocalRotate(Vector3.zero, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(outerRing.rectTransform.DOScale(Vector3.one, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(outerRing.rectTransform.DOLocalRotate(Vector3.zero, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(star.rectTransform.DOAnchorPosX(-55, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(star.rectTransform.DOScale(Vector3.one, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Append(upperLeftCorner.rectTransform.DOScale(Vector3.one, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(upperLeftCorner.rectTransform.DOAnchorPos(new Vector2(-52, 52), 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(lowerLeftCorner.rectTransform.DOScale(Vector3.one, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(lowerLeftCorner.rectTransform.DOAnchorPos(new Vector2(-52, -52), 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Play(); } private void PlayDeselectAnimation() { selectionSequence?.Kill(true); background.sprite = unselectedSprite; background.color = Color.white; selectionSequence = DOTween.Sequence(); selectionSequence.Append(upperLeftCorner.rectTransform.DOScale(Vector3.zero, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(upperLeftCorner.rectTransform.DOAnchorPos(Vector2.zero,0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(lowerLeftCorner.rectTransform.DOScale(Vector3.zero, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(lowerLeftCorner.rectTransform.DOAnchorPos(Vector2.zero, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(background.rectTransform.DOAnchorPosX(0f, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(background.rectTransform.DOSizeDelta(new Vector2(100, 100), 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(innerRing.rectTransform.DOScale(Vector3.zero, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(innerRing.rectTransform.DOLocalRotate(new Vector3(0, 0, 180), 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(outerRing.rectTransform.DOScale(Vector3.zero, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(outerRing.rectTransform.DOLocalRotate(new Vector3(0, 0, -180), 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(star.rectTransform.DOScale(Vector3.zero, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Join(star.rectTransform.DOAnchorPosX(0, 0.4f).SetEase(Ease.OutQuart)); selectionSequence.Play(); } } }