feat: update song selection, score UI, and song creator features

- SongSelectManager/SongDetailPanel: 곡 선택 및 상세 패널 개선
- SongCreatorManager: 곡 생성 기능 추가
- FinalScoreLabel/ScoreManager: 결과 화면 점수 UI 업데이트
- MarqueeText: 마퀴 텍스트 컴포넌트 개선
- NoteData/SongController: 노트 데이터 및 컨트롤러 보완

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
jongjae0305
2026-05-29 17:29:50 +09:00
parent 72dad1ce4c
commit c335995a9a
10 changed files with 686 additions and 171 deletions
+63
View File
@@ -50,14 +50,27 @@ public class SongCreatorManager : MonoBehaviour
[SerializeField] private BeatSageUploader beatSageUploader;
[SerializeField] private NasPublisher nasPublisher;
private static readonly Color NeonBg = new Color(0.05f, 0.82f, 0.95f, 0.42f);
private static readonly Color DarkButtonBg = new Color(0.09f, 0.22f, 0.27f, 0.66f);
private static readonly Color DisabledBg = new Color(0.06f, 0.12f, 0.15f, 0.48f);
private static readonly Color ButtonText = new Color(0.92f, 1.0f, 1.0f, 1.0f);
private static readonly Color MutedText = new Color(0.66f, 0.80f, 0.84f, 0.76f);
private static readonly Color NeonOutline = new Color(0.25f, 0.96f, 1.0f, 0.42f);
private static string InputPath =>
Path.Combine(Application.persistentDataPath, "input");
private readonly List<string> audioFiles = new();
private string _pendingFilePath;
private void OnValidate()
{
ApplyButtonStyles();
}
private void Start()
{
ApplyButtonStyles();
Directory.CreateDirectory(InputPath);
if (inputPathHint != null)
@@ -258,6 +271,7 @@ public class SongCreatorManager : MonoBehaviour
if (refreshBtn != null) refreshBtn.interactable = value;
if (filePickerBtn != null) filePickerBtn.interactable = value;
if (urlDownloadBtn != null) urlDownloadBtn.interactable = value;
ApplyButtonStyles();
}
private void OnFilePickerClicked()
@@ -323,6 +337,7 @@ public class SongCreatorManager : MonoBehaviour
{
SetAddStatus("Downloading...");
if (urlDownloadBtn != null) urlDownloadBtn.interactable = false;
ApplyButtonStyles();
string fileName;
try
@@ -341,6 +356,7 @@ public class SongCreatorManager : MonoBehaviour
yield return req.SendWebRequest();
if (urlDownloadBtn != null) urlDownloadBtn.interactable = true;
ApplyButtonStyles();
if (req.result == UnityWebRequest.Result.Success)
{
@@ -358,4 +374,51 @@ public class SongCreatorManager : MonoBehaviour
}
private void SetAddStatus(string msg) { if (addStatusText != null) addStatusText.text = msg; }
private void ApplyButtonStyles()
{
ApplyCreatorButtonStyle(generateButton, true);
ApplyCreatorButtonStyle(urlDownloadBtn, true);
ApplyCreatorButtonStyle(refreshBtn, false);
ApplyCreatorButtonStyle(filePickerBtn, false);
ApplyCreatorButtonStyle(backButton, false);
}
private static void ApplyCreatorButtonStyle(Button btn, bool primary)
{
if (btn == null)
return;
Color bg = btn.interactable ? (primary ? NeonBg : DarkButtonBg) : DisabledBg;
if (btn.targetGraphic is Image img)
{
img.color = bg;
img.raycastTarget = true;
}
var colors = btn.colors;
colors.normalColor = bg;
colors.highlightedColor = btn.interactable
? new Color(0.10f, 0.95f, 1.0f, primary ? 0.58f : 0.48f)
: DisabledBg;
colors.pressedColor = btn.interactable
? new Color(0.02f, 0.58f, 0.72f, 0.80f)
: DisabledBg;
colors.selectedColor = colors.highlightedColor;
colors.disabledColor = DisabledBg;
colors.fadeDuration = 0.08f;
btn.colors = colors;
TMP_Text label = btn.GetComponentInChildren<TMP_Text>(true);
if (label != null)
{
label.color = btn.interactable ? ButtonText : MutedText;
label.raycastTarget = false;
}
Outline outline = btn.GetComponent<Outline>() ?? btn.gameObject.AddComponent<Outline>();
outline.enabled = btn.interactable;
outline.effectColor = NeonOutline;
outline.effectDistance = new Vector2(0.0f, -0.28f);
}
}