Files
bansonic_beta_main/Assets/songsDatabase/SongDataController/SongButton.cs
T

332 lines
11 KiB
C#

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Collections;
using DG.Tweening;
public class SongButton : MonoBehaviour
{
[Header("thisSong_so")]
public ScriptableObject thisSong_so;
[Header("Inspector")]
public Text songNameText;
public Text multiNameText;
public Text joinTime_and_dlcName_Text;
public Text songOverallDescriptionText;
public Text highestScoreText;
public Text highestScoreDifficultyText;
public Text difficultyIDText;
public Text songIDText;
public Image buttonImage;
public Image scoreLevelImage;
[Header("Difficulty Level Images")]
public Image lvl_img_01;
public Image lvl_img_02;
public Image lvl_img_03;
[Header("Inspector")]
public Image profileImage;
public int song_songSerialID;
[Header("select mark")]
public Image selected_boarder;
public Image fade_image;
[Header("Rank Configuration")]
public RankConfig rankConfig;
[Header("Fade Image Settings")]
public float minAlpha = 0f;
public float maxAlpha = 1f;
public float blinkDuration = 0.5f;
private static SongButton currentSelected;
private Coroutine fadeCoroutine;
private Coroutine blinkCoroutine;
public void Start()
{
if (selected_boarder != null)
{
Color c = selected_boarder.color;
c.a = 0f;
selected_boarder.color = c;
}
if (fade_image != null)
{
Color c = fade_image.color;
c.a = 0f;
fade_image.color = c;
}
}
public void SetButtonData(string songName, int highestScore, int difficultyID, Sprite songSprite, int songID)
{
Debug.Log("SetButtonData called, songID: " + songID);
SongData sd = thisSong_so as SongData;
if (sd != null) sd.LoadPersistent();
if (SongDataLibrary.Instance != null && SongDataLibrary.Instance.IsLoaded)
sd = SongDataLibrary.Instance.GetSongDataByID(songID) ?? sd;
if (sd != null)
{
if (songNameText != null) songNameText.text = sd.songName;
if (multiNameText != null)
multiNameText.text = "Artist: " + sd.artistName + " | Illustrator: " + sd.painter + " | Charter: " + sd.level_creator;
if (joinTime_and_dlcName_Text != null)
{
string join = string.IsNullOrEmpty(sd.thisLevel_addDateString) ? "Unknown" : sd.thisLevel_addDateString;
string dlc = string.IsNullOrEmpty(sd.belongsTo_whichDLC) ? "Unknown DLC" : sd.belongsTo_whichDLC;
joinTime_and_dlcName_Text.text = "Release: " + join + " | DLC: " + dlc;
}
if (songOverallDescriptionText != null)
{
songOverallDescriptionText.text = string.IsNullOrEmpty(sd.thisLevel_overallDescription) ? "" : sd.thisLevel_overallDescription;
}
sd.GetAbsoluteHighestScore(out int bestTotal, out int bestDiff, out string bestDiffName);
if (bestTotal < 0) bestTotal = 0;
if (highestScoreText != null) highestScoreText.text = bestTotal.ToString();
if (highestScoreDifficultyText != null)
highestScoreDifficultyText.text = string.IsNullOrEmpty(bestDiffName) ? "" : "(" + bestDiffName + ")";
if (scoreLevelImage != null)
{
if (rankConfig != null)
{
scoreLevelImage.sprite = rankConfig.GetRankSprite(bestTotal);
}
else
{
Debug.LogWarning("SongButton: rankConfig is not assigned!");
}
}
// Determine displayed difficulty: show the highest difficultyLEVEL present in chartFiles (if any)
string diffDisplay = "0";
if (sd.chartFiles != null && sd.chartFiles.Count > 0)
{
float maxLevel = float.MinValue;
foreach (var entry in sd.chartFiles)
{
if (entry == null) continue;
if (entry.difficultyLEVEL > maxLevel)
{
maxLevel = entry.difficultyLEVEL;
}
}
if (maxLevel != float.MinValue)
{
diffDisplay = maxLevel.ToString();
}
}
if (difficultyIDText != null) difficultyIDText.text = diffDisplay;
// Set rank images for the first three difficulties
SetDifficultyRankImages(sd);
if (buttonImage != null) buttonImage.sprite = sd.backgroudPIC;
if (profileImage != null)
{
profileImage.sprite = sd.card_profileImage;
if (sd.card_profileImage != null)
{
profileImage.color = new Color(profileImage.color.r, profileImage.color.g, profileImage.color.b, 1f);
profileImage.enabled = true;
}
else
{
profileImage.enabled = false;
}
}
song_songSerialID = songID;
if (songIDText != null) songIDText.text = "Song ID: " + song_songSerialID.ToString();
}
else
{
if (songNameText != null) songNameText.text = songName;
if (highestScoreText != null) highestScoreText.text = "PR: " + highestScore.ToString();
if (difficultyIDText != null) difficultyIDText.text = difficultyID.ToString();
if (buttonImage != null) buttonImage.sprite = songSprite;
song_songSerialID = songID;
if (songIDText != null) songIDText.text = "Song ID: " + song_songSerialID.ToString();
}
}
private void SetDifficultyRankImages(SongData sd)
{
if (rankConfig == null) return;
Image[] rankImages = { lvl_img_01, lvl_img_02, lvl_img_03 };
for (int i = 0; i < rankImages.Length; i++)
{
if (rankImages[i] == null) continue;
if (sd.chartFiles != null && i < sd.chartFiles.Count)
{
var entry = sd.chartFiles[i];
if (entry != null)
{
int score = entry.totalPersonalRecordForThisDifficulty;
rankImages[i].sprite = rankConfig.GetRankSprite(score);
rankImages[i].enabled = rankImages[i].sprite != null;
}
else
{
rankImages[i].enabled = false;
}
}
else
{
rankImages[i].enabled = false;
}
}
}
public void OnSongButtonClick()
{
Debug.Log("Song button clicked, song_songSerialID: " + song_songSerialID);
SongData selectedSong = null;
if (SongDataLibrary.Instance != null && SongDataLibrary.Instance.IsLoaded)
{
selectedSong = SongDataLibrary.Instance.GetSongDataByID(song_songSerialID);
}
if (selectedSong == null)
{
selectedSong = thisSong_so as SongData;
}
if (selectedSong != null)
{
selectedSong.LoadPersistent();
selectedSong.GetAbsoluteHighestScore(out int bestTotal, out int bestDiff, out string bestDiffName);
if (bestDiff >= 0)
{
selectedSong.thisLevel_selectedDifficultyID = bestDiff;
}
if (currentSelected != null && currentSelected != this)
{
currentSelected.FadeOutSelectedBorder();
}
currentSelected = this;
FadeInSelectedBorder();
SongDataHolder.SelectedSongData = selectedSong;
var selectedInfo = Object.FindAnyObjectByType<selected_songInfo>();
if (selectedInfo != null)
{
selectedInfo.UpdateSelectedSongDisplay();
}
// Save per-DLC selected song index to PlayerPrefs
string dlcKey = SongSelectUI.CurrentDlcKey;
if (string.IsNullOrEmpty(dlcKey)) dlcKey = "default_0";
string prefsKey = "song_selected_" + dlcKey;
int index = GetIndexAmongSongButtons();
PlayerPrefs.SetInt(prefsKey, index);
PlayerPrefs.Save();
Debug.Log($"SongButton: saved selected song index {index} for key {prefsKey}");
}
else
{
Debug.LogError("未找到对应的 SongData, songID: " + song_songSerialID);
}
}
private int GetIndexAmongSongButtons()
{
// Use parent traversal to find only SongButton siblings, to avoid mismatch when other UI children exist.
var parent = transform.parent;
if (parent == null) return 0;
int idx = 0;
for (int i = 0; i < parent.childCount; i++)
{
var child = parent.GetChild(i);
var sb = child != null ? child.GetComponent<SongButton>() : null;
if (sb == null) continue;
if (sb == this) return idx;
idx++;
}
return 0;
}
private void FadeInSelectedBorder()
{
if (selected_boarder != null)
{
if (fadeCoroutine != null) StopCoroutine(fadeCoroutine);
fadeCoroutine = StartCoroutine(FadeImage(selected_boarder, selected_boarder.color.a, 1f, 0.3f));
}
if (fade_image != null)
{
if (blinkCoroutine != null) StopCoroutine(blinkCoroutine);
blinkCoroutine = StartCoroutine(BlinkFadeImage());
}
}
private void FadeOutSelectedBorder()
{
if (selected_boarder != null)
{
if (fadeCoroutine != null) StopCoroutine(fadeCoroutine);
fadeCoroutine = StartCoroutine(FadeImage(selected_boarder, selected_boarder.color.a, 0f, 0.3f));
}
if (fade_image != null)
{
if (blinkCoroutine != null) StopCoroutine(blinkCoroutine);
fadeCoroutine = StartCoroutine(FadeImage(fade_image, fade_image.color.a, 0f, 0.3f));
}
}
private IEnumerator FadeImage(Image img, float startAlpha, float endAlpha, float duration)
{
if (img == null) yield break;
float time = 0f;
Color color = img.color;
while (time < duration)
{
time += Time.deltaTime;
float alpha = Mathf.Lerp(startAlpha, endAlpha, time / duration);
color.a = alpha;
img.color = color;
yield return null;
}
color.a = endAlpha;
img.color = color;
}
private IEnumerator BlinkFadeImage()
{
if (fade_image == null) yield break;
Color color = fade_image.color;
while (true)
{
float time = 0f;
while (time < blinkDuration / 2f)
{
time += Time.deltaTime;
float alpha = Mathf.Lerp(minAlpha, maxAlpha, time / (blinkDuration / 2f));
color.a = alpha;
fade_image.color = color;
yield return null;
}
time = 0f;
while (time < blinkDuration / 2f)
{
time += Time.deltaTime;
float alpha = Mathf.Lerp(maxAlpha, minAlpha, time / (blinkDuration / 2f));
color.a = alpha;
fade_image.color = color;
yield return null;
}
}
}
}