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
+82 -82
View File
@@ -156,8 +156,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -18, y: 19.5}
m_SizeDelta: {x: 30, y: 7}
m_AnchoredPosition: {x: -19, y: 19.5}
m_SizeDelta: {x: 34, y: 7}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &11933137
MonoBehaviour:
@@ -456,8 +456,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 4}
m_SizeDelta: {x: 50, y: 0.4}
m_AnchoredPosition: {x: 0, y: 4.2}
m_SizeDelta: {x: 68, y: 0.4}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &97527770
MonoBehaviour:
@@ -652,7 +652,7 @@ MonoBehaviour:
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: 0
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
@@ -1267,8 +1267,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 12}
m_SizeDelta: {x: 50, y: 6}
m_AnchoredPosition: {x: -16.05, y: 10.8}
m_SizeDelta: {x: 42, y: 4.8}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &285384529
MonoBehaviour:
@@ -1290,7 +1290,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text:
m_text: Anesthesia
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
@@ -1299,7 +1299,7 @@ MonoBehaviour:
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
rgba: 3439329279
m_fontColor: {r: 1, g: 1, b: 1, a: 0.8}
m_enableVertexGradient: 0
m_colorMode: 3
@@ -1312,7 +1312,7 @@ MonoBehaviour:
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: 0
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
@@ -1324,7 +1324,7 @@ MonoBehaviour:
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_HorizontalAlignment: 1
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
@@ -1405,8 +1405,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -26.6, y: -9.4}
m_SizeDelta: {x: 52.7, y: 49}
m_AnchoredPosition: {x: -44, y: -9.4}
m_SizeDelta: {x: 56, y: 49}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &313102848
GameObject:
@@ -1682,7 +1682,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!224 &365318615
RectTransform:
m_ObjectHideFlags: 0
@@ -1830,16 +1830,16 @@ RectTransform:
m_GameObject: {fileID: 365636951}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.9, y: 0.9, z: 0.9}
m_ConstrainProportionsScale: 1
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1536039027}
m_Father: {fileID: 1223157292}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 12, y: -14}
m_SizeDelta: {x: 22, y: 7}
m_AnchoredPosition: {x: 17, y: -9.7}
m_SizeDelta: {x: 27, y: 6}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &365636953
MonoBehaviour:
@@ -1957,7 +1957,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0.1, y: -9.4}
m_AnchoredPosition: {x: -15, y: -9.4}
m_SizeDelta: {x: 0.5, y: 49}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &393692317
@@ -2300,16 +2300,16 @@ RectTransform:
m_GameObject: {fileID: 549476134}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.9, y: 0.9, z: 0.9}
m_ConstrainProportionsScale: 1
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 138927897}
m_Father: {fileID: 1223157292}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -12, y: -5}
m_SizeDelta: {x: 22, y: 7}
m_AnchoredPosition: {x: -17, y: -2}
m_SizeDelta: {x: 27, y: 6}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &549476136
MonoBehaviour:
@@ -2428,7 +2428,7 @@ RectTransform:
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 15.5}
m_SizeDelta: {x: 104, y: 0.5}
m_SizeDelta: {x: 144, y: 0.5}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &584186484
MonoBehaviour:
@@ -2534,7 +2534,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -0.54999924, y: 0.040000916}
m_AnchoredPosition: {x: -0.55000305, y: 0.040000916}
m_SizeDelta: {x: 1.1, y: 3.12}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &624828134
@@ -2639,8 +2639,8 @@ RectTransform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 661667650}
m_LocalRotation: {x: 0, y: 0.38268343, z: 0, w: 0.92387956}
m_LocalPosition: {x: 0, y: 0, z: 20.29}
m_LocalScale: {x: 0.25, y: 0.25, z: 1}
m_LocalPosition: {x: 0, y: 0, z: 21.44}
m_LocalScale: {x: 0.21, y: 0.21, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 140294464}
@@ -2652,7 +2652,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 45, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 24.01, y: 4.71}
m_AnchoredPosition: {x: 28.85, y: 4.71}
m_SizeDelta: {x: 105.885, y: 71.226}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &661667652
@@ -2786,8 +2786,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 14, y: 19.5}
m_SizeDelta: {x: 30, y: 7}
m_AnchoredPosition: {x: 17.5, y: 19.5}
m_SizeDelta: {x: 34, y: 7}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &711973508
MonoBehaviour:
@@ -3087,7 +3087,7 @@ MonoBehaviour:
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: 0
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
@@ -3224,7 +3224,7 @@ MonoBehaviour:
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: 0
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
@@ -3310,16 +3310,16 @@ RectTransform:
m_GameObject: {fileID: 848577108}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.9, y: 0.9, z: 0.9}
m_ConstrainProportionsScale: 1
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 2121890138}
m_Father: {fileID: 1223157292}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 12, y: -5}
m_SizeDelta: {x: 22, y: 7}
m_AnchoredPosition: {x: 17, y: -2}
m_SizeDelta: {x: 27, y: 6}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &848577110
MonoBehaviour:
@@ -3437,8 +3437,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 7}
m_SizeDelta: {x: 50, y: 5}
m_AnchoredPosition: {x: 20.5, y: 10.8}
m_SizeDelta: {x: 28, y: 4.8}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &861505383
MonoBehaviour:
@@ -3460,7 +3460,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text:
m_text: BPM 120
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
@@ -3469,7 +3469,7 @@ MonoBehaviour:
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
rgba: 2583691263
m_fontColor: {r: 1, g: 1, b: 1, a: 0.6}
m_enableVertexGradient: 0
m_colorMode: 3
@@ -3482,7 +3482,7 @@ MonoBehaviour:
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: 0
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
@@ -3494,7 +3494,7 @@ MonoBehaviour:
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_HorizontalAlignment: 1
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
@@ -3611,8 +3611,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -3, y: 18.5}
m_SizeDelta: {x: 38, y: 8}
m_AnchoredPosition: {x: -5.5, y: 17}
m_SizeDelta: {x: 63, y: 7.4}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &921515098
MonoBehaviour:
@@ -3634,7 +3634,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: ---
m_text: Oxlo
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
@@ -3656,13 +3656,13 @@ MonoBehaviour:
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: 0
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 6.5
m_fontSizeBase: 6.5
m_fontSize: 7.2
m_fontSizeBase: 7.2
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
@@ -3817,16 +3817,16 @@ RectTransform:
m_GameObject: {fileID: 967100893}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.9, y: 0.9, z: 0.9}
m_ConstrainProportionsScale: 1
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 829525444}
m_Father: {fileID: 1223157292}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 16.400002, y: -22.900002}
m_SizeDelta: {x: 16, y: 7}
m_AnchoredPosition: {x: 22.5, y: -20.2}
m_SizeDelta: {x: 18, y: 6.4}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &967100895
MonoBehaviour:
@@ -4019,8 +4019,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: -18.5}
m_SizeDelta: {x: 50, y: 0.4}
m_AnchoredPosition: {x: 0, y: -16}
m_SizeDelta: {x: 68, y: 0.4}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1010856770
MonoBehaviour:
@@ -4095,7 +4095,7 @@ RectTransform:
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 23.5}
m_SizeDelta: {x: 104, y: 0.5}
m_SizeDelta: {x: 144, y: 0.5}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1014388332
MonoBehaviour:
@@ -4255,7 +4255,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
m_IsActive: 1
--- !u!224 &1223157292
RectTransform:
m_ObjectHideFlags: 0
@@ -4265,7 +4265,7 @@ RectTransform:
m_GameObject: {fileID: 1223157291}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.89393, y: 0.89393, z: 0.89393}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1293606945}
@@ -4287,8 +4287,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 26.6, y: -9.4}
m_SizeDelta: {x: 52.7, y: 49}
m_AnchoredPosition: {x: 29, y: -9.4}
m_SizeDelta: {x: 86, y: 49}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1223157293
MonoBehaviour:
@@ -4486,7 +4486,7 @@ MonoBehaviour:
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: 0
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
@@ -4656,8 +4656,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 21, y: 20.5}
m_SizeDelta: {x: 8, y: 7}
m_AnchoredPosition: {x: 37, y: 20.5}
m_SizeDelta: {x: 7, y: 6.5}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1293606946
MonoBehaviour:
@@ -4769,16 +4769,16 @@ RectTransform:
m_GameObject: {fileID: 1388756479}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.9, y: 0.9, z: 0.9}
m_ConstrainProportionsScale: 1
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1245764537}
m_Father: {fileID: 1223157292}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -9.5, y: -22.7}
m_SizeDelta: {x: 34, y: 7}
m_AnchoredPosition: {x: -12.5, y: -20.2}
m_SizeDelta: {x: 40, y: 6.4}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1388756481
MonoBehaviour:
@@ -5026,16 +5026,16 @@ RectTransform:
m_GameObject: {fileID: 1436526096}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.9, y: 0.9, z: 0.9}
m_ConstrainProportionsScale: 1
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1786385005}
m_Father: {fileID: 1223157292}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -12, y: -14}
m_SizeDelta: {x: 22, y: 7}
m_AnchoredPosition: {x: -17, y: -9.7}
m_SizeDelta: {x: 27, y: 6}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1436526098
MonoBehaviour:
@@ -5241,8 +5241,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0.67, y: 4.46}
m_SizeDelta: {x: 105.885, y: 68.223}
m_AnchoredPosition: {x: 0.4, y: 4.5}
m_SizeDelta: {x: 148, y: 68.2}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1445586371
MonoBehaviour:
@@ -5493,7 +5493,7 @@ MonoBehaviour:
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: 0
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
@@ -5933,7 +5933,7 @@ RectTransform:
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 28.5}
m_SizeDelta: {x: 100, y: 9}
m_SizeDelta: {x: 138, y: 9}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1754869934
MonoBehaviour:
@@ -6233,7 +6233,7 @@ MonoBehaviour:
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: 0
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
@@ -6626,7 +6626,7 @@ MonoBehaviour:
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: 0
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
@@ -6720,8 +6720,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -6, y: -21.5}
m_SizeDelta: {x: 34, y: 7}
m_AnchoredPosition: {x: -12.5, y: -20.2}
m_SizeDelta: {x: 40, y: 6.4}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1888615411
MonoBehaviour:
@@ -7157,8 +7157,8 @@ RectTransform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1946485404}
m_LocalRotation: {x: 0, y: -0.38268343, z: 0, w: 0.92387956}
m_LocalPosition: {x: 0, y: 0, z: 18.33}
m_LocalScale: {x: 0.25, y: 0.25, z: 1}
m_LocalPosition: {x: 0, y: 0, z: 20.96}
m_LocalScale: {x: 0.21, y: 0.21, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 2121492652}
@@ -7167,7 +7167,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: -45, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -21.77, y: 4.39}
m_AnchoredPosition: {x: -27.37, y: 4.39}
m_SizeDelta: {x: 105.89, y: 66.53}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1946485406
@@ -7727,7 +7727,7 @@ MonoBehaviour:
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: 0
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
+137 -16
View File
@@ -11,12 +11,16 @@ namespace VRBeats
private string initialValue = "";
private ScoreManager scoreManager = null;
private GameObject resultRoot = null;
private TextMeshProUGUI rankBackText = null;
private TextMeshProUGUI rankShadowText = null;
private TextMeshProUGUI rankDepthText = null;
private TextMeshProUGUI rankRimText = null;
private TextMeshProUGUI rankMainText = null;
private TextMeshProUGUI rankHighlightText = null;
private TextMeshProUGUI resultScoreText = null;
private TextMeshProUGUI resultAccuracyText = null;
private TextMeshProUGUI resultComboText = null;
private CanvasGroup scoreHudCanvasGroup = null;
private void Awake()
{
@@ -24,6 +28,9 @@ namespace VRBeats
initialValue += "0";
scoreManager = FindFirstObjectByType<ScoreManager>();
if (scoreManager != null)
scoreHudCanvasGroup = scoreManager.GetComponent<CanvasGroup>() ??
scoreManager.gameObject.AddComponent<CanvasGroup>();
ApplyPopupTextStyle();
BuildResultLayout();
}
@@ -34,6 +41,7 @@ namespace VRBeats
return;
SetTitleActive(false);
SetScoreHudVisible(false);
gameObject.CancelAllTweens();
if (resultRoot != null)
@@ -58,6 +66,7 @@ namespace VRBeats
scoreText.gameObject.SetActive(true);
SetTitleActive(true);
SetScoreHudVisible(true);
ApplyPopupTextStyle();
if (scoreText != null)
@@ -67,9 +76,12 @@ namespace VRBeats
private void PopulateResultLayout()
{
if (scoreManager == null ||
rankBackText == null ||
rankShadowText == null ||
rankDepthText == null ||
rankRimText == null ||
rankMainText == null ||
rankHighlightText == null ||
resultScoreText == null ||
resultAccuracyText == null ||
resultComboText == null)
@@ -78,16 +90,20 @@ namespace VRBeats
string rank = scoreManager.Rank;
Color mainColor = HexToColor(scoreManager.RankColorHex);
Color depthColor = HexToColor(GetRankDepthColorHex(rank));
Color rimColor = HexToColor(GetRankRimColorHex(rank));
rankBackText.text = rank;
rankShadowText.text = rank;
rankDepthText.text = rank;
rankDepthText.color = depthColor;
rankRimText.text = rank;
rankMainText.text = rank;
rankMainText.color = mainColor;
rankHighlightText.text = rank;
ApplyMetalRankColors(mainColor, depthColor, rimColor);
resultScoreText.text =
$"<size=48%><color=#A0C8FF>SCORE</color></size>\n{scoreManager.CurrentScore:N0}";
$"<size=56%><color=#A0C8FF>SCORE</color></size>\n{scoreManager.CurrentScore:N0}";
resultAccuracyText.text =
$"<size=70%><color=#A0C8FF>ACCURACY</color></size> {scoreManager.AccuracyPercent:0.0}%";
$"<color=#A0C8FF>ACCURACY</color> {scoreManager.AccuracyPercent:0.0}%";
resultComboText.text = $"MAX COMBO {scoreManager.MaxCombo}";
}
@@ -123,6 +139,16 @@ namespace VRBeats
scoreText.richText = true;
}
private void SetScoreHudVisible(bool visible)
{
if (scoreHudCanvasGroup == null)
return;
scoreHudCanvasGroup.alpha = visible ? 1.0f : 0.0f;
scoreHudCanvasGroup.interactable = false;
scoreHudCanvasGroup.blocksRaycasts = false;
}
private void BuildResultLayout()
{
if (scoreText == null)
@@ -137,32 +163,47 @@ namespace VRBeats
RectTransform rootRect = root.AddComponent<RectTransform>();
rootRect.anchorMin = new Vector2(0.5f, 0.5f);
rootRect.anchorMax = new Vector2(0.5f, 0.5f);
rootRect.anchoredPosition = Vector2.zero;
rootRect.sizeDelta = new Vector2(620.0f, 250.0f);
rootRect.anchoredPosition = new Vector2(5.0f, 3.1f);
rootRect.sizeDelta = new Vector2(82.0f, 34.0f);
root.SetActive(false);
resultRoot = root;
// Rank badge left side — hierarchy order = draw order (shadow first, main on top)
// Panel-local coordinates are small world-canvas units, not screen pixels.
rankBackText = MakeTmpLabel(root.transform, "RankBackText",
new Vector2(-20.9f, -1.1f), new Vector2(37.0f, 27.0f), 16.0f,
new Color(0.0f, 0.0f, 0.0f, 0.48f), TextAlignmentOptions.Midline);
rankShadowText = MakeTmpLabel(root.transform, "RankShadowText",
new Vector2(-166.0f, 6.0f), new Vector2(200.0f, 200.0f), 14.0f,
new Color(0.0f, 0.0f, 0.0f, 0.55f), TextAlignmentOptions.Midline);
new Vector2(-21.35f, -0.55f), new Vector2(37.0f, 27.0f), 16.0f,
new Color(0.0f, 0.06f, 0.14f, 0.82f), TextAlignmentOptions.Midline);
rankDepthText = MakeTmpLabel(root.transform, "RankDepthText",
new Vector2(-168.0f, 8.0f), new Vector2(200.0f, 200.0f), 14.0f,
new Vector2(-21.8f, -0.1f), new Vector2(37.0f, 27.0f), 16.0f,
Color.white, TextAlignmentOptions.Midline);
rankRimText = MakeTmpLabel(root.transform, "RankRimText",
new Vector2(-22.15f, 0.22f), new Vector2(37.0f, 27.0f), 16.0f,
Color.white, TextAlignmentOptions.Midline);
rankMainText = MakeTmpLabel(root.transform, "RankMainText",
new Vector2(-170.0f, 10.0f), new Vector2(200.0f, 200.0f), 14.0f,
new Vector2(-22.45f, 0.5f), new Vector2(37.0f, 27.0f), 16.0f,
Color.white, TextAlignmentOptions.Midline);
rankHighlightText = MakeTmpLabel(root.transform, "RankHighlightText",
new Vector2(-22.85f, 1.0f), new Vector2(37.0f, 27.0f), 16.0f,
Color.white, TextAlignmentOptions.Midline);
// Score, accuracy, combo right side
resultScoreText = MakeTmpLabel(root.transform, "ResultScoreText",
new Vector2(70.0f, 58.0f), new Vector2(260.0f, 90.0f), 5.5f,
new Vector2(16.8f, 7.4f), new Vector2(43.0f, 10.8f), 5.35f,
Color.white, TextAlignmentOptions.MidlineLeft);
resultAccuracyText = MakeTmpLabel(root.transform, "ResultAccuracyText",
new Vector2(70.0f, 0.0f), new Vector2(260.0f, 46.0f), 3.4f,
new Vector2(16.8f, -1.2f), new Vector2(43.0f, 5.4f), 3.05f,
new Color(0.84f, 0.97f, 1.0f, 0.9f), TextAlignmentOptions.MidlineLeft);
resultComboText = MakeTmpLabel(root.transform, "ResultComboText",
new Vector2(70.0f, -52.0f), new Vector2(260.0f, 44.0f), 3.0f,
new Vector2(16.8f, -6.8f), new Vector2(43.0f, 5.4f), 2.95f,
new Color(0.84f, 0.97f, 1.0f, 1.0f), TextAlignmentOptions.MidlineLeft);
ConfigureRankLayer(rankBackText, new Color(0.0f, 0.0f, 0.0f, 0.72f), 0.34f);
ConfigureRankLayer(rankShadowText, new Color(0.0f, 0.0f, 0.0f, 0.74f), 0.2f);
ConfigureRankLayer(rankDepthText, new Color(0.0f, 0.0f, 0.0f, 0.55f), 0.13f);
ConfigureRankLayer(rankRimText, new Color(1.0f, 1.0f, 1.0f, 0.82f), 0.08f);
ConfigureRankLayer(rankMainText, new Color(0.0f, 0.16f, 0.28f, 0.7f), 0.06f);
ConfigureRankLayer(rankHighlightText, new Color(1.0f, 1.0f, 1.0f, 0.35f), 0.02f);
}
private TextMeshProUGUI MakeTmpLabel(Transform parent, string name,
@@ -178,11 +219,14 @@ namespace VRBeats
TextMeshProUGUI tmp = go.AddComponent<TextMeshProUGUI>();
tmp.fontSize = fontSize;
tmp.enableAutoSizing = true;
tmp.fontSizeMin = fontSize * 0.6f;
tmp.fontSizeMax = fontSize;
tmp.color = color;
tmp.alignment = align;
tmp.overflowMode = TextOverflowModes.Overflow;
tmp.overflowMode = TextOverflowModes.Truncate;
tmp.textWrappingMode = TextWrappingModes.NoWrap;
tmp.lineSpacing = -8.0f;
tmp.lineSpacing = -4.0f;
tmp.raycastTarget = false;
if (scoreText != null && scoreText.font != null)
@@ -194,6 +238,68 @@ namespace VRBeats
return tmp;
}
private static void ConfigureRankLayer(TextMeshProUGUI tmp, Color outlineColor, float outlineWidth)
{
if (tmp == null)
return;
tmp.fontSizeMin = tmp.fontSize * 0.75f;
tmp.outlineColor = outlineColor;
tmp.outlineWidth = outlineWidth;
tmp.characterSpacing = -1.0f;
}
private void ApplyMetalRankColors(Color mainColor, Color depthColor, Color rimColor)
{
Color darkMetal = new Color(0.02f, 0.08f, 0.14f, 0.82f);
Color steel = new Color(0.70f, 0.95f, 1.0f, 1.0f);
Color whiteHot = new Color(1.0f, 1.0f, 1.0f, 1.0f);
Color lowerMain = Color.Lerp(mainColor, depthColor, 0.55f);
SetSolidRankLayer(rankBackText, new Color(0.0f, 0.0f, 0.0f, 0.50f));
SetSolidRankLayer(rankShadowText, darkMetal);
SetRankGradient(rankDepthText,
Color.Lerp(depthColor, steel, 0.22f),
depthColor,
new Color(0.0f, 0.12f, 0.22f, 0.95f),
new Color(0.0f, 0.05f, 0.10f, 0.95f));
SetRankGradient(rankRimText,
whiteHot,
rimColor,
Color.Lerp(rimColor, mainColor, 0.35f),
Color.Lerp(mainColor, depthColor, 0.45f));
SetRankGradient(rankMainText,
whiteHot,
Color.Lerp(whiteHot, rimColor, 0.45f),
Color.Lerp(mainColor, steel, 0.18f),
lowerMain);
SetRankGradient(rankHighlightText,
new Color(1.0f, 1.0f, 1.0f, 0.42f),
new Color(0.92f, 1.0f, 1.0f, 0.28f),
new Color(1.0f, 1.0f, 1.0f, 0.08f),
new Color(1.0f, 1.0f, 1.0f, 0.02f));
}
private static void SetSolidRankLayer(TextMeshProUGUI tmp, Color color)
{
if (tmp == null)
return;
tmp.enableVertexGradient = false;
tmp.color = color;
}
private static void SetRankGradient(TextMeshProUGUI tmp,
Color topLeft, Color topRight, Color bottomLeft, Color bottomRight)
{
if (tmp == null)
return;
tmp.enableVertexGradient = true;
tmp.color = Color.white;
tmp.colorGradient = new VertexGradient(topLeft, topRight, bottomLeft, bottomRight);
}
private static string GetRankDepthColorHex(string rank)
{
switch (rank)
@@ -209,6 +315,21 @@ namespace VRBeats
}
}
private static string GetRankRimColorHex(string rank)
{
switch (rank)
{
case "M": return "#FFFFFF";
case "S+": return "#E8FFFF";
case "S": return "#FFF4B8";
case "A": return "#F1FFD8";
case "B": return "#FFF5B8";
case "C": return "#FFE0B8";
case "D": return "#FFD5D5";
default: return "#E8F0F8";
}
}
private static Color HexToColor(string hex)
{
if (ColorUtility.TryParseHtmlString(hex, out Color color))
@@ -142,6 +142,25 @@ namespace VRBeats
UpdateScoreTween();
}
public void ApplyForcedResult(int noteCount, int perfect, int great, int good, int miss, int forcedMaxCombo)
{
totalNoteCount = Mathf.Max(0, noteCount);
perfectCount = Mathf.Max(0, perfect);
greatCount = Mathf.Max(0, great);
goodCount = Mathf.Max(0, good);
missCount = Mathf.Max(0, miss);
judgedNoteCount = perfectCount + greatCount + goodCount + missCount;
earnedAccuracyPoints = perfectCount * 1000 + greatCount * 900 + goodCount * 700;
maxCombo = Mathf.Clamp(forcedMaxCombo, 0, Mathf.Max(totalNoteCount, judgedNoteCount));
currentCombo = maxCombo;
currentMultiplier = missCount > 0 ? 1.0f : GetComboMultiplier(currentCombo);
lastJudgement = missCount > 0 ? BeatJudgement.Miss : BeatJudgement.Perfect;
judgementTimer = 0.45f;
resultFinalized = false;
UpdateScoreTween();
UpdateMultiplierLoaderValue();
}
public void CompleteSong()
{
if (resultFinalized)