diff --git a/unity/Assets/Scenes/Test.unity b/unity/Assets/Scenes/Gameplay.unity
similarity index 100%
rename from unity/Assets/Scenes/Test.unity
rename to unity/Assets/Scenes/Gameplay.unity
diff --git a/unity/Assets/Scenes/Test.unity.meta b/unity/Assets/Scenes/Gameplay.unity.meta
similarity index 100%
rename from unity/Assets/Scenes/Test.unity.meta
rename to unity/Assets/Scenes/Gameplay.unity.meta
diff --git a/unity/Assets/Scenes/MainMenu.unity b/unity/Assets/Scenes/MainMenu.unity
new file mode 100644
index 0000000..e19d4ed
--- /dev/null
+++ b/unity/Assets/Scenes/MainMenu.unity
@@ -0,0 +1,2255 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 3
+ m_OcclusionCullingData: {fileID: 0}
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionEnabled: 0
+ m_DisplayOccluded: 0
+ m_SceneDepthBufferWidth: 512
+ m_SceneDepthBufferHeight: 512
+ m_ShadowDepthBufferWidth: 512
+ m_ShadowDepthBufferHeight: 512
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 12
+ m_GIWorkflowMode: 1
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_LightmapEditorSettings:
+ serializedVersion: 12
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAmbientOcclusion: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 2
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVRBounces: 2
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVREnvironmentMIS: 1
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_LightProbeSampleCountMultiplier: 4
+ m_LightingDataAsset: {fileID: 0}
+ m_LightingSettings: {fileID: 0}
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 3
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ buildHeightMesh: 0
+ maxJobWorkers: 0
+ preserveTilesOutsideBounds: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!1 &80595826
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 80595827}
+ - component: {fileID: 80595830}
+ - component: {fileID: 80595829}
+ - component: {fileID: 80595828}
+ - component: {fileID: 80595831}
+ m_Layer: 5
+ m_HasEditorInfo: 1
+ m_Name: quitButto
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &80595827
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 80595826}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 1130016372}
+ m_Father: {fileID: 1691857676}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 160, y: 30}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &80595828
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 80595826}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 80595829}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!114 &80595829
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 80595826}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &80595830
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 80595826}
+ m_CullTransparentMesh: 1
+--- !u!114 &80595831
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 80595826}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: ae410525a1083304f99715898b5338e5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ selectSFX:
+ audioClip: {fileID: 0}
+ volume: 1
+ submitSFX:
+ audioClip: {fileID: 0}
+ volume: 1
+--- !u!1 &294136589
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 294136590}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: Score Manager
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &294136590
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 294136589}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &385113093
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 385113094}
+ - component: {fileID: 385113097}
+ - component: {fileID: 385113096}
+ - component: {fileID: 385113095}
+ - component: {fileID: 385113098}
+ m_Layer: 5
+ m_HasEditorInfo: 1
+ m_Name: StartButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &385113094
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 385113093}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 2080939694}
+ m_Father: {fileID: 1691857676}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 160, y: 30}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &385113095
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 385113093}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 385113096}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!114 &385113096
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 385113093}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &385113097
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 385113093}
+ m_CullTransparentMesh: 1
+--- !u!114 &385113098
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 385113093}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: ae410525a1083304f99715898b5338e5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ selectSFX:
+ audioClip: {fileID: 0}
+ volume: 1
+ submitSFX:
+ audioClip: {fileID: 0}
+ volume: 1
+--- !u!1 &423191006
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 423191007}
+ - component: {fileID: 423191008}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: Game Manager
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &423191007
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 423191006}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &423191008
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 423191006}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0bc49c6d42cb88a4c981d949a1cd87cd, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ gameState: 0
+--- !u!1 &447407676
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 447407677}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: Environment
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &447407677
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 447407676}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 1489821382}
+ - {fileID: 1658933197}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &574406655
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 574406656}
+ - component: {fileID: 574406657}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: Scene Loader
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &574406656
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 574406655}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 897692926}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &574406657
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 574406655}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0a37d3e2e303c704891353a7bf072dfb, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ transitionImage: {fileID: 1022684516}
+ fadeTime: 1
+ mainMenuScene: MainMenu
+ gameplayScene: Gameplay
+ scoringScene: Scoring
+--- !u!1 &700186399
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 700186401}
+ - component: {fileID: 700186400}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: BGM
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &700186400
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 700186399}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: a003985e85b4bae45a4068089bbc9dd2, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ bgmClip: {fileID: 0}
+ restartIfSameClip: 1
+--- !u!4 &700186401
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 700186399}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 3.7981668, y: 2.3406625, z: -5.142841}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &806529721
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 806529723}
+ - component: {fileID: 806529722}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: Global Post Processing Volume
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &806529722
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 806529721}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IsGlobal: 1
+ priority: 0
+ blendDistance: 0
+ weight: 1
+ sharedProfile: {fileID: 11400000, guid: a5df7670907771f438bd562f2d1c9c3c, type: 2}
+--- !u!4 &806529723
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 806529721}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 10}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 2033362374}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &880812692
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 880812693}
+ - component: {fileID: 880812695}
+ - component: {fileID: 880812694}
+ m_Layer: 5
+ m_HasEditorInfo: 1
+ m_Name: Text (Legacy)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &880812693
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 880812692}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 1790418111}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &880812694
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 880812692}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 10
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Button
+--- !u!222 &880812695
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 880812692}
+ m_CullTransparentMesh: 1
+--- !u!1 &897692925
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 897692926}
+ - component: {fileID: 897692929}
+ - component: {fileID: 897692928}
+ - component: {fileID: 897692927}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: Canvas
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &897692926
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 897692925}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 1022684515}
+ m_Father: {fileID: 574406656}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!114 &897692927
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 897692925}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!114 &897692928
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 897692925}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 0
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 800, y: 600}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+ m_PresetInfoIsWorld: 0
+--- !u!223 &897692929
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 897692925}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_VertexColorAlwaysGammaSpace: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_UpdateRectTransformForStandalone: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 1000
+ m_TargetDisplay: 0
+--- !u!1 &939394519
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 939394520}
+ - component: {fileID: 939394522}
+ - component: {fileID: 939394521}
+ m_Layer: 5
+ m_HasEditorInfo: 1
+ m_Name: Text (Legacy)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &939394520
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 939394519}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 1713032428}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &939394521
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 939394519}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 10
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Button
+--- !u!222 &939394522
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 939394519}
+ m_CullTransparentMesh: 1
+--- !u!1 &1022684514
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 1022684515}
+ - component: {fileID: 1022684517}
+ - component: {fileID: 1022684516}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: Image
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 0
+--- !u!224 &1022684515
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1022684514}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 897692926}
+ 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: 0}
+ m_SizeDelta: {x: 1920, y: 1080}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1022684516
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1022684514}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 1}
+ m_RaycastTarget: 0
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1022684517
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1022684514}
+ m_CullTransparentMesh: 1
+--- !u!1 &1130016371
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 1130016372}
+ - component: {fileID: 1130016374}
+ - component: {fileID: 1130016373}
+ m_Layer: 5
+ m_HasEditorInfo: 1
+ m_Name: Text (Legacy)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1130016372
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1130016371}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 80595827}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1130016373
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1130016371}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 10
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Button
+--- !u!222 &1130016374
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1130016371}
+ m_CullTransparentMesh: 1
+--- !u!1 &1340997606
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 1340997607}
+ - component: {fileID: 1340997608}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: Audio Manager
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1340997607
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1340997606}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1340997608
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1340997606}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0575607a807dc2d4c83554aa364916e4, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!1 &1431098212
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 1431098215}
+ - component: {fileID: 1431098214}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: EventSystem
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &1431098214
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1431098212}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_FirstSelected: {fileID: 0}
+ m_sendNavigationEvents: 1
+ m_DragThreshold: 10
+--- !u!4 &1431098215
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1431098212}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 402.7887}
+ m_LocalScale: {x: 80.55774, y: 80.55774, z: 80.55774}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 1767662996}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1489821381
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 1489821382}
+ - component: {fileID: 1489821385}
+ - component: {fileID: 1489821384}
+ - component: {fileID: 1489821383}
+ - component: {fileID: 1489821386}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: Quad
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1489821382
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1489821381}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 15}
+ m_LocalScale: {x: 25.8, y: 10.3, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 447407677}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!64 &1489821383
+MeshCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1489821381}
+ m_Material: {fileID: 0}
+ m_IncludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_ExcludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_LayerOverridePriority: 0
+ m_IsTrigger: 0
+ m_ProvidesContacts: 0
+ m_Enabled: 1
+ serializedVersion: 5
+ m_Convex: 0
+ m_CookingOptions: 30
+ m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &1489821384
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1489821381}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10306, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &1489821385
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1489821381}
+ m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!114 &1489821386
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1489821381}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5d02538b22b71af44afbf1b46dae06f3, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!1 &1658933196
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 1658933197}
+ - component: {fileID: 1658933198}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: Ambient Sound
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1658933197
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1658933196}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 447407677}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!82 &1658933198
+AudioSource:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1658933196}
+ m_Enabled: 1
+ serializedVersion: 4
+ OutputAudioMixerGroup: {fileID: 0}
+ m_audioClip: {fileID: 8300000, guid: e37e0167dcb8d2b40863b321a86d5091, type: 3}
+ m_PlayOnAwake: 1
+ m_Volume: 0.3
+ m_Pitch: 1
+ Loop: 1
+ Mute: 0
+ Spatialize: 0
+ SpatializePostEffects: 0
+ Priority: 128
+ DopplerLevel: 1
+ MinDistance: 1
+ MaxDistance: 500
+ Pan2D: 0
+ rolloffMode: 0
+ BypassEffects: 0
+ BypassListenerEffects: 0
+ BypassReverbZones: 0
+ rolloffCustomCurve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 1
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ panLevelCustomCurve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ spreadCustomCurve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ reverbZoneMixCustomCurve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+--- !u!1 &1691857675
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 1691857676}
+ - component: {fileID: 1691857679}
+ - component: {fileID: 1691857678}
+ - component: {fileID: 1691857677}
+ m_Layer: 5
+ m_HasEditorInfo: 1
+ m_Name: Button
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1691857676
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1691857675}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 385113094}
+ - {fileID: 1790418111}
+ - {fileID: 80595827}
+ m_Father: {fileID: 1767662996}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 960.00006, y: -340}
+ m_SizeDelta: {x: 800, y: 300}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1691857677
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1691857675}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Padding:
+ m_Left: 0
+ m_Right: 0
+ m_Top: 0
+ m_Bottom: 0
+ m_ChildAlignment: 4
+ m_Spacing: 20
+ m_ChildForceExpandWidth: 1
+ m_ChildForceExpandHeight: 1
+ m_ChildControlWidth: 0
+ m_ChildControlHeight: 0
+ m_ChildScaleWidth: 0
+ m_ChildScaleHeight: 0
+ m_ReverseArrangement: 0
+--- !u!223 &1691857678
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1691857675}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 2
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_VertexColorAlwaysGammaSpace: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_UpdateRectTransformForStandalone: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!114 &1691857679
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1691857675}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!1 &1713032427
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 1713032428}
+ - component: {fileID: 1713032431}
+ - component: {fileID: 1713032430}
+ - component: {fileID: 1713032429}
+ - component: {fileID: 1713032432}
+ m_Layer: 5
+ m_HasEditorInfo: 1
+ m_Name: SettingsBackButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1713032428
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1713032427}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 939394520}
+ m_Father: {fileID: 1856375276}
+ 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: 0}
+ m_SizeDelta: {x: 160, y: 30}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1713032429
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1713032427}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1713032430}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!114 &1713032430
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1713032427}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1713032431
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1713032427}
+ m_CullTransparentMesh: 1
+--- !u!114 &1713032432
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1713032427}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: ae410525a1083304f99715898b5338e5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ selectSFX:
+ audioClip: {fileID: 0}
+ volume: 1
+ submitSFX:
+ audioClip: {fileID: 0}
+ volume: 1
+--- !u!1 &1767662992
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 1767662996}
+ - component: {fileID: 1767662995}
+ - component: {fileID: 1767662994}
+ - component: {fileID: 1767662993}
+ - component: {fileID: 1767662997}
+ m_Layer: 5
+ m_HasEditorInfo: 1
+ m_Name: UI
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &1767662993
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1767662992}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!114 &1767662994
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1767662992}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 1920, y: 1080}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+ m_PresetInfoIsWorld: 0
+--- !u!223 &1767662995
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1767662992}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 1
+ m_Camera: {fileID: 2033362373}
+ m_PlaneDistance: 5
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_VertexColorAlwaysGammaSpace: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_UpdateRectTransformForStandalone: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &1767662996
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1767662992}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 1431098215}
+ - {fileID: 1691857676}
+ - {fileID: 1856375276}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!114 &1767662997
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1767662992}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: dfb474cbd721479419d2ce88a2701448, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ startButton: {fileID: 385113095}
+ settingsButton: {fileID: 1790418112}
+ quitButton: {fileID: 80595828}
+ settingsPanel: {fileID: 1856375275}
+ settingsBackButton: {fileID: 1713032429}
+--- !u!1 &1790418110
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 1790418111}
+ - component: {fileID: 1790418114}
+ - component: {fileID: 1790418113}
+ - component: {fileID: 1790418112}
+ - component: {fileID: 1790418115}
+ m_Layer: 5
+ m_HasEditorInfo: 1
+ m_Name: settingsButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1790418111
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1790418110}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 880812693}
+ m_Father: {fileID: 1691857676}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 160, y: 30}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1790418112
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1790418110}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1790418113}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!114 &1790418113
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1790418110}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1790418114
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1790418110}
+ m_CullTransparentMesh: 1
+--- !u!114 &1790418115
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1790418110}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: ae410525a1083304f99715898b5338e5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ selectSFX:
+ audioClip: {fileID: 0}
+ volume: 1
+ submitSFX:
+ audioClip: {fileID: 0}
+ volume: 1
+--- !u!1 &1856375275
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 1856375276}
+ - component: {fileID: 1856375278}
+ - component: {fileID: 1856375277}
+ m_Layer: 5
+ m_HasEditorInfo: 1
+ m_Name: SettingsPanel
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 0
+--- !u!224 &1856375276
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1856375275}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 1713032428}
+ m_Father: {fileID: 1767662996}
+ 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: 0}
+ m_SizeDelta: {x: 1920, y: 1080}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1856375277
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1856375275}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0.51789284, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1856375278
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1856375275}
+ m_CullTransparentMesh: 1
+--- !u!1 &2033362371
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 2033362374}
+ - component: {fileID: 2033362373}
+ - component: {fileID: 2033362372}
+ - component: {fileID: 2033362375}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: Main Camera
+ m_TagString: MainCamera
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!81 &2033362372
+AudioListener:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2033362371}
+ m_Enabled: 1
+--- !u!20 &2033362373
+Camera:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2033362371}
+ m_Enabled: 1
+ serializedVersion: 2
+ m_ClearFlags: 2
+ m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+ m_projectionMatrixMode: 1
+ m_GateFitMode: 2
+ m_FOVAxisMode: 0
+ m_Iso: 200
+ m_ShutterSpeed: 0.005
+ m_Aperture: 16
+ m_FocusDistance: 10
+ m_FocalLength: 50
+ m_BladeCount: 5
+ m_Curvature: {x: 2, y: 11}
+ m_BarrelClipping: 0.25
+ m_Anamorphism: 0
+ m_SensorSize: {x: 36, y: 24}
+ m_LensShift: {x: 0, y: 0}
+ m_NormalizedViewPortRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ near clip plane: 0.3
+ far clip plane: 1000
+ field of view: 60
+ orthographic: 1
+ orthographic size: 5
+ m_Depth: -1
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingPath: -1
+ m_TargetTexture: {fileID: 0}
+ m_TargetDisplay: 0
+ m_TargetEye: 3
+ m_HDR: 1
+ m_AllowMSAA: 1
+ m_enableGDRP: 1
+ m_backfaceCulling: 0
+ m_AllowDynamicResolution: 0
+ m_ForceIntoRT: 0
+ m_OcclusionCulling: 1
+ m_StereoConvergence: 10
+ m_StereoSeparation: 0.022
+--- !u!4 &2033362374
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2033362371}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: -10}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 806529723}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &2033362375
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2033362371}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_RenderShadows: 1
+ m_RequiresDepthTextureOption: 2
+ m_RequiresOpaqueTextureOption: 2
+ m_CameraType: 0
+ m_Cameras: []
+ m_RendererIndex: -1
+ m_VolumeLayerMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_VolumeTrigger: {fileID: 0}
+ m_VolumeFrameworkUpdateModeOption: 2
+ m_RenderPostProcessing: 1
+ m_Antialiasing: 2
+ m_AntialiasingQuality: 2
+ m_StopNaN: 0
+ m_Dithering: 0
+ m_ClearDepth: 1
+ m_AllowXRRendering: 1
+ m_AllowHDROutput: 1
+ m_UseScreenCoordOverride: 0
+ m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0}
+ m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0}
+ m_RequiresDepthTexture: 0
+ m_RequiresColorTexture: 0
+ m_Version: 2
+ m_TaaSettings:
+ m_Quality: 3
+ m_FrameInfluence: 0.1
+ m_JitterScale: 1
+ m_MipBias: 0
+ m_VarianceClampScale: 0.9
+ m_ContrastAdaptiveSharpening: 0
+--- !u!1 &2080939693
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 2080939694}
+ - component: {fileID: 2080939696}
+ - component: {fileID: 2080939695}
+ m_Layer: 5
+ m_HasEditorInfo: 1
+ m_Name: Text (Legacy)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &2080939694
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2080939693}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 385113094}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &2080939695
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2080939693}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 10
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Button
+--- !u!222 &2080939696
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2080939693}
+ m_CullTransparentMesh: 1
+--- !u!1660057539 &9223372036854775807
+SceneRoots:
+ m_ObjectHideFlags: 0
+ m_Roots:
+ - {fileID: 2033362374}
+ - {fileID: 447407677}
+ - {fileID: 1767662996}
+ - {fileID: 294136590}
+ - {fileID: 423191007}
+ - {fileID: 1340997607}
+ - {fileID: 574406656}
+ - {fileID: 700186401}
diff --git a/unity/Assets/Scenes/MainMenu.unity.meta b/unity/Assets/Scenes/MainMenu.unity.meta
new file mode 100644
index 0000000..2a4ba0e
--- /dev/null
+++ b/unity/Assets/Scenes/MainMenu.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: XnIZvCj/WilIPm5sxv000GrkA0fQi4oGpaqJswmJmlEkEZvwKwlSzlE=
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/SampleScene.scene b/unity/Assets/Scenes/Scoring.scene
similarity index 100%
rename from unity/Assets/Scenes/SampleScene.scene
rename to unity/Assets/Scenes/Scoring.scene
diff --git a/unity/Assets/Scenes/SampleScene.scene.meta b/unity/Assets/Scenes/Scoring.scene.meta
similarity index 100%
rename from unity/Assets/Scenes/SampleScene.scene.meta
rename to unity/Assets/Scenes/Scoring.scene.meta
diff --git a/unity/Assets/UI.meta b/unity/Assets/UI.meta
new file mode 100644
index 0000000..0022db5
--- /dev/null
+++ b/unity/Assets/UI.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: CXwWtS75VH2kRhpqXyENCxWvKc+sMGX3ZmBGWqfZFB4KWUEa9B6DD34=
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UI/AudioManager.cs b/unity/Assets/UI/AudioManager.cs
new file mode 100644
index 0000000..6cd1f59
--- /dev/null
+++ b/unity/Assets/UI/AudioManager.cs
@@ -0,0 +1,124 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace GameFramework
+{
+ ///
+ /// 音频片段数据,可挂到 ScriptableObject 或直接 SerializeField。
+ ///
+ [System.Serializable]
+ public class AudioData
+ {
+ public AudioClip audioClip;
+ [Range(0f, 1f)] public float volume = 1f;
+ }
+
+ ///
+ /// 全局音频管理器(持久单例)。
+ /// 管理 BGM(背景音乐,循环)和 SFX(音效,一次性)。
+ /// 音量通过 PlayerPrefs 持久化。
+ ///
+ public class AudioManager : PersistentSingleton
+ {
+ const string PREF_BGM_VOLUME = "AudioManager_BGMVolume";
+ const string PREF_SFX_VOLUME = "AudioManager_SFXVolume";
+
+ AudioSource bgmPlayer; // 背景音乐播放器
+ AudioSource sfxPlayer; // 音效播放器
+
+ float bgmVolume = 1f;
+ float sfxVolume = 1f;
+
+ public float BGMVolume => bgmVolume;
+ public float SFXVolume => sfxVolume;
+
+ protected override void Awake()
+ {
+ base.Awake();
+ // 如果是重复实例,base.Awake 已调用 Destroy,这里直接返回
+ if (Instance != this) return;
+
+ // 创建两个 AudioSource
+ bgmPlayer = gameObject.AddComponent();
+ bgmPlayer.loop = true;
+ bgmPlayer.playOnAwake = false;
+
+ sfxPlayer = gameObject.AddComponent();
+ sfxPlayer.loop = false;
+ sfxPlayer.playOnAwake = false;
+
+ // 读取持久化音量
+ bgmVolume = PlayerPrefs.GetFloat(PREF_BGM_VOLUME, 1f);
+ sfxVolume = PlayerPrefs.GetFloat(PREF_SFX_VOLUME, 1f);
+ bgmPlayer.volume = bgmVolume;
+ sfxPlayer.volume = sfxVolume;
+ }
+
+ #region BGM
+ ///
+ /// 播放背景音乐(循环)。
+ ///
+ public void PlayBGM(AudioClip clip, bool restart = false)
+ {
+ if (clip == null) return;
+ if (bgmPlayer.isPlaying && bgmPlayer.clip == clip && !restart)
+ return;
+ bgmPlayer.clip = clip;
+ bgmPlayer.volume = bgmVolume;
+ bgmPlayer.Play();
+ }
+
+ public void StopBGM()
+ {
+ if (bgmPlayer.isPlaying)
+ bgmPlayer.Stop();
+ }
+
+ public void PauseBGM() => bgmPlayer.Pause();
+ public void UnpauseBGM() => bgmPlayer.UnPause();
+
+ public void SetBGMVolume(float volume)
+ {
+ bgmVolume = Mathf.Clamp01(volume);
+ bgmPlayer.volume = bgmVolume;
+ PlayerPrefs.SetFloat(PREF_BGM_VOLUME, bgmVolume);
+ PlayerPrefs.Save();
+ }
+ #endregion
+
+ #region SFX
+ ///
+ /// 播放单个音效。
+ ///
+ public void PlaySFX(AudioData data)
+ {
+ if (data == null || data.audioClip == null) return;
+ // sfxPlayer.volume 已在 Awake 中设为 sfxVolume,
+ // PlayOneShot 的 volumeScale 再乘以 data.volume,
+ // 最终音量 = sfxVolume * data.volume
+ sfxPlayer.PlayOneShot(data.audioClip, data.volume);
+ }
+
+ ///
+ /// 从列表中随机播放一个音效。
+ ///
+ public void PlayRandomSFX(AudioData data, List variants = null)
+ {
+ if (variants != null && variants.Count > 0)
+ {
+ PlaySFX(variants[Random.Range(0, variants.Count)]);
+ return;
+ }
+ PlaySFX(data);
+ }
+
+ public void SetSFXVolume(float volume)
+ {
+ sfxVolume = Mathf.Clamp01(volume);
+ PlayerPrefs.SetFloat(PREF_SFX_VOLUME, sfxVolume);
+ PlayerPrefs.Save();
+ }
+ #endregion
+ }
+}
diff --git a/unity/Assets/UI/AudioManager.cs.meta b/unity/Assets/UI/AudioManager.cs.meta
new file mode 100644
index 0000000..83ecc1e
--- /dev/null
+++ b/unity/Assets/UI/AudioManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: D38YsCytVCoe3CxQzCPwoXB7xeRjwedpI2nk1WvamOgtg/ae5hcGCSs=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UI/GameManager.cs b/unity/Assets/UI/GameManager.cs
new file mode 100644
index 0000000..9a3d7e6
--- /dev/null
+++ b/unity/Assets/UI/GameManager.cs
@@ -0,0 +1,39 @@
+using System;
+using UnityEngine;
+
+namespace GameFramework
+{
+ ///
+ /// 全局游戏状态管理器(持久化单例)。
+ /// 维护 GameState,提供 GameOver 触发入口与 onGameOver 事件。
+ ///
+ public class GameManager : PersistentSingleton
+ {
+ /// 游戏结束时触发(GameOverScreen 等订阅)。
+ public static Action onGameOver;
+
+ public static GameState GameState
+ {
+ get => Instance.gameState;
+ set => Instance.gameState = value;
+ }
+
+ [SerializeField] private GameState gameState = GameState.Playing;
+
+ /// 触发游戏结束:设状态 + 触发事件。玩家被敌人抓到时调用。
+ public static void GameOver()
+ {
+ if (Instance == null) return;
+ GameState = GameState.GameOver;
+ onGameOver?.Invoke();
+ }
+ }
+
+ public enum GameState
+ {
+ Playing,
+ Paused,
+ GameOver,
+ Scoring
+ }
+}
diff --git a/unity/Assets/UI/GameManager.cs.meta b/unity/Assets/UI/GameManager.cs.meta
new file mode 100644
index 0000000..4302ea7
--- /dev/null
+++ b/unity/Assets/UI/GameManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: DyhMsSP+VS+OBQvXR+1P+BSSSFCIom/YSNUnOiYi6jxFYXKFgsHuPno=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UI/GameOverScreen.cs b/unity/Assets/UI/GameOverScreen.cs
new file mode 100644
index 0000000..a4f1d45
--- /dev/null
+++ b/unity/Assets/UI/GameOverScreen.cs
@@ -0,0 +1,91 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace GameFramework
+{
+ ///
+ /// 游戏结束画面。
+ /// 监听 GameManager.onGameOver 事件,显示结束 Canvas 并暂停游戏。
+ /// 玩家按确认键或点击按钮后跳转到排行榜场景。
+ ///
+ public class GameOverScreen : MonoBehaviour
+ {
+ [Header("Canvas")]
+ [SerializeField] Canvas gameOverCanvas;
+
+ [Header("Button")]
+ [SerializeField] Button confirmButton;
+
+ [Header("Audio")]
+ [SerializeField] AudioData gameOverSFX;
+
+ [Header("Input")]
+ [SerializeField] KeyCode confirmKey = KeyCode.Return;
+
+ void OnEnable()
+ {
+ GameManager.onGameOver += ShowGameOver;
+ }
+
+ void OnDisable()
+ {
+ GameManager.onGameOver -= ShowGameOver;
+ }
+
+ void Start()
+ {
+ // 初始隐藏
+ if (gameOverCanvas != null)
+ gameOverCanvas.enabled = false;
+
+ if (confirmButton != null)
+ confirmButton.onClick.AddListener(OnConfirmClick);
+ }
+
+ void ShowGameOver()
+ {
+ // 显示结束画面
+ if (gameOverCanvas != null)
+ gameOverCanvas.enabled = true;
+
+ // 暂停游戏
+ if (TimeController.Instance != null)
+ TimeController.Instance.Pause();
+
+ // 显示鼠标
+ Cursor.visible = true;
+ Cursor.lockState = CursorLockMode.None;
+
+ // 选中确认按钮
+ if (confirmButton != null)
+ confirmButton.Select();
+
+ // 播放音效
+ if (AudioManager.Instance != null && gameOverSFX != null)
+ AudioManager.Instance.PlaySFX(gameOverSFX);
+ }
+
+ void Update()
+ {
+ // 游戏结束画面可见时,按确认键跳转
+ if (gameOverCanvas != null && gameOverCanvas.enabled)
+ {
+ if (Input.GetKeyDown(confirmKey) || Input.GetKeyDown(KeyCode.Space))
+ {
+ OnConfirmClick();
+ }
+ }
+ }
+
+ void OnConfirmClick()
+ {
+ // 先解除暂停
+ if (TimeController.Instance != null)
+ TimeController.Instance.Unpause();
+
+ // 跳转到排行榜场景
+ if (SceneLoader.Instance != null)
+ SceneLoader.Instance.LoadScoringScene();
+ }
+ }
+}
diff --git a/unity/Assets/UI/GameOverScreen.cs.meta b/unity/Assets/UI/GameOverScreen.cs.meta
new file mode 100644
index 0000000..ced777a
--- /dev/null
+++ b/unity/Assets/UI/GameOverScreen.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: CClOsC78Vi9/cIog8UeuUzecgGTFlu5AQ5iyvdkeMcyG1n6ns9R5ds8=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UI/MainMenuUIController.cs b/unity/Assets/UI/MainMenuUIController.cs
new file mode 100644
index 0000000..3699df6
--- /dev/null
+++ b/unity/Assets/UI/MainMenuUIController.cs
@@ -0,0 +1,68 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace GameFramework
+{
+ ///
+ /// 主菜单 UI 控制器。
+ /// 绑定三个按钮:开始游戏(异步加载)、设置(占位面板)、退出游戏。
+ ///
+ public class MainMenuUIController : MonoBehaviour
+ {
+ [Header("Buttons")]
+ [SerializeField] Button startButton;
+ [SerializeField] Button settingsButton;
+ [SerializeField] Button quitButton;
+
+ [Header("Settings Panel (placeholder)")]
+ [SerializeField] GameObject settingsPanel;
+ [SerializeField] Button settingsBackButton;
+
+ void Start()
+ {
+ // 绑定按钮事件
+ if (startButton != null)
+ startButton.onClick.AddListener(OnStartClick);
+
+ if (settingsButton != null)
+ settingsButton.onClick.AddListener(OnSettingsClick);
+
+ if (quitButton != null)
+ quitButton.onClick.AddListener(OnQuitClick);
+
+ if (settingsBackButton != null)
+ settingsBackButton.onClick.AddListener(OnSettingsBackClick);
+
+ // 确保设置面板初始关闭
+ if (settingsPanel != null)
+ settingsPanel.SetActive(false);
+ }
+
+ void OnStartClick()
+ {
+ if (SceneLoader.Instance != null)
+ SceneLoader.Instance.LoadGameplayScene();
+ }
+
+ void OnSettingsClick()
+ {
+ if (settingsPanel != null)
+ settingsPanel.SetActive(true);
+ }
+
+ void OnSettingsBackClick()
+ {
+ if (settingsPanel != null)
+ settingsPanel.SetActive(false);
+ }
+
+ void OnQuitClick()
+ {
+#if UNITY_EDITOR
+ UnityEditor.EditorApplication.isPlaying = false;
+#else
+ Application.Quit();
+#endif
+ }
+ }
+}
diff --git a/unity/Assets/UI/MainMenuUIController.cs.meta b/unity/Assets/UI/MainMenuUIController.cs.meta
new file mode 100644
index 0000000..6d8c698
--- /dev/null
+++ b/unity/Assets/UI/MainMenuUIController.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: WyxNsS2pACmL6nb3C9ZLbWufBaEs5AhC21a1IcXRRWytNigGK78ei90=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UI/PauseMenu.cs b/unity/Assets/UI/PauseMenu.cs
new file mode 100644
index 0000000..4b1970d
--- /dev/null
+++ b/unity/Assets/UI/PauseMenu.cs
@@ -0,0 +1,160 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace GameFramework
+{
+ ///
+ /// 暂停菜单控制器。
+ /// 按 ESC 切换暂停/继续。
+ /// 暂停时显示菜单 Canvas,提供继续/设置/返回主菜单三个按钮。
+ /// 使用 old Input Manager(Input.GetKeyDown)。
+ ///
+ public class PauseMenu : MonoBehaviour
+ {
+ [Header("Input")]
+ [SerializeField] KeyCode pauseKey = KeyCode.Escape;
+
+ [Header("Canvas")]
+ [SerializeField] Canvas hudCanvas;
+ [SerializeField] Canvas pauseMenuCanvas;
+
+ [Header("Buttons")]
+ [SerializeField] Button resumeButton;
+ [SerializeField] Button settingsButton;
+ [SerializeField] Button mainMenuButton;
+
+ [Header("Settings Panel (placeholder)")]
+ [SerializeField] GameObject settingsPanel;
+ [SerializeField] Button settingsBackButton;
+
+ [Header("Audio")]
+ [SerializeField] AudioData pauseSFX;
+ [SerializeField] AudioData unpauseSFX;
+
+ bool isPaused = false;
+
+ void Start()
+ {
+ // 绑定按钮
+ if (resumeButton != null)
+ resumeButton.onClick.AddListener(OnResumeClick);
+ if (settingsButton != null)
+ settingsButton.onClick.AddListener(OnSettingsClick);
+ if (mainMenuButton != null)
+ mainMenuButton.onClick.AddListener(OnMainMenuClick);
+ if (settingsBackButton != null)
+ settingsBackButton.onClick.AddListener(OnSettingsBackClick);
+
+ // 初始状态
+ if (pauseMenuCanvas != null)
+ pauseMenuCanvas.enabled = false;
+ if (settingsPanel != null)
+ settingsPanel.SetActive(false);
+
+ // 确保游戏开始时是运行状态
+ if (TimeController.Instance != null)
+ TimeController.Instance.Unpause();
+ if (GameManager.Instance != null)
+ GameManager.GameState = GameState.Playing;
+ }
+
+ void Update()
+ {
+ // 游戏结束时不允许暂停
+ if (GameManager.Instance != null && GameManager.GameState == GameState.GameOver)
+ return;
+
+ if (Input.GetKeyDown(pauseKey))
+ {
+ if (isPaused)
+ Resume();
+ else
+ Pause();
+ }
+ }
+
+ void Pause()
+ {
+ isPaused = true;
+
+ if (TimeController.Instance != null)
+ TimeController.Instance.Pause();
+
+ if (GameManager.Instance != null)
+ GameManager.GameState = GameState.Paused;
+
+ if (hudCanvas != null)
+ hudCanvas.enabled = false;
+ if (pauseMenuCanvas != null)
+ pauseMenuCanvas.enabled = true;
+
+ // 显示鼠标
+ Cursor.visible = true;
+ Cursor.lockState = CursorLockMode.None;
+
+ // 选中继续按钮(手柄/键盘导航用)
+ if (resumeButton != null)
+ resumeButton.Select();
+
+ if (AudioManager.Instance != null && pauseSFX != null)
+ AudioManager.Instance.PlaySFX(pauseSFX);
+ }
+
+ void Resume()
+ {
+ isPaused = false;
+
+ if (TimeController.Instance != null)
+ TimeController.Instance.Unpause();
+
+ if (GameManager.Instance != null)
+ GameManager.GameState = GameState.Playing;
+
+ if (hudCanvas != null)
+ hudCanvas.enabled = true;
+ if (pauseMenuCanvas != null)
+ pauseMenuCanvas.enabled = false;
+
+ // 隐藏鼠标
+ Cursor.visible = false;
+ Cursor.lockState = CursorLockMode.Locked;
+
+ if (AudioManager.Instance != null && unpauseSFX != null)
+ AudioManager.Instance.PlaySFX(unpauseSFX);
+ }
+
+ // 只在 Pause 状态下才响应按钮
+ // Resume 是公开方法因为按钮 onClick 需要调用
+ public void OnResumeClick()
+ {
+ if (isPaused)
+ Resume();
+ }
+
+ void OnSettingsClick()
+ {
+ if (settingsPanel != null)
+ settingsPanel.SetActive(true);
+ }
+
+ void OnSettingsBackClick()
+ {
+ if (settingsPanel != null)
+ settingsPanel.SetActive(false);
+ }
+
+ void OnMainMenuClick()
+ {
+ // 先解除暂停,再加载主菜单
+ isPaused = false;
+ if (TimeController.Instance != null)
+ TimeController.Instance.Unpause();
+
+ if (pauseMenuCanvas != null)
+ pauseMenuCanvas.enabled = false;
+
+ if (SceneLoader.Instance != null)
+ SceneLoader.Instance.LoadMainMenuScene();
+ }
+ }
+}
diff --git a/unity/Assets/UI/PauseMenu.cs.meta b/unity/Assets/UI/PauseMenu.cs.meta
new file mode 100644
index 0000000..71335f7
--- /dev/null
+++ b/unity/Assets/UI/PauseMenu.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: DHgWs3+kUy5RNMyJcnH1NVpwyVBiplJDeLTX0ne96zBO1RYpFbBNLuY=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UI/PersistentSingleton.cs b/unity/Assets/UI/PersistentSingleton.cs
new file mode 100644
index 0000000..1541f63
--- /dev/null
+++ b/unity/Assets/UI/PersistentSingleton.cs
@@ -0,0 +1,27 @@
+using UnityEngine;
+
+namespace GameFramework
+{
+ ///
+ /// 持久化单例基类。跨场景保留(DontDestroyOnLoad),重复实例自动销毁。
+ /// 管理器(AudioManager / ScoreManager / GameManager / SceneLoader)都继承它。
+ ///
+ public class PersistentSingleton : MonoBehaviour where T : Component
+ {
+ public static T Instance { get; private set; }
+
+ protected virtual void Awake()
+ {
+ if (Instance == null)
+ {
+ Instance = this as T;
+ }
+ else if (Instance != this)
+ {
+ Destroy(gameObject);
+ return;
+ }
+ DontDestroyOnLoad(gameObject);
+ }
+ }
+}
diff --git a/unity/Assets/UI/PersistentSingleton.cs.meta b/unity/Assets/UI/PersistentSingleton.cs.meta
new file mode 100644
index 0000000..f2ed016
--- /dev/null
+++ b/unity/Assets/UI/PersistentSingleton.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: Wy9L5Hj/VCki7vksVlCr2JOVegJd1LSd6eBd6rLntdvyUmypRGMclXg=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UI/SaveSystem.cs b/unity/Assets/UI/SaveSystem.cs
new file mode 100644
index 0000000..12f6bf7
--- /dev/null
+++ b/unity/Assets/UI/SaveSystem.cs
@@ -0,0 +1,58 @@
+using System;
+using System.IO;
+using UnityEngine;
+
+namespace GameFramework
+{
+ ///
+ /// 静态 JSON 存档系统。读写 Application.persistentDataPath 下的文件。
+ /// 排行榜等数据通过它持久化。
+ ///
+ public static class SaveSystem
+ {
+ public static void Save(string saveFileName, object data)
+ {
+ var json = JsonUtility.ToJson(data);
+ var path = Path.Combine(Application.persistentDataPath, saveFileName);
+
+ try
+ {
+ File.WriteAllText(path, json);
+#if UNITY_EDITOR
+ Debug.Log($"[SaveSystem] 已保存到 {path}");
+#endif
+ }
+ catch (Exception exception)
+ {
+ Debug.LogError($"[SaveSystem] 保存失败 {path}\n{exception}");
+ }
+ }
+
+ public static T Load(string saveFileName)
+ {
+ var path = Path.Combine(Application.persistentDataPath, saveFileName);
+ try
+ {
+ var json = File.ReadAllText(path);
+ return JsonUtility.FromJson(json);
+ }
+ catch (Exception exception)
+ {
+ Debug.LogError($"[SaveSystem] 读取失败 {path}\n{exception}");
+ return default;
+ }
+ }
+
+ public static void DeleteSaveFile(string saveFileName)
+ {
+ var path = Path.Combine(Application.persistentDataPath, saveFileName);
+ try { File.Delete(path); }
+ catch (Exception exception) { Debug.LogError($"[SaveSystem] 删除失败 {path}\n{exception}"); }
+ }
+
+ public static bool SaveFileExists(string saveFileName)
+ {
+ return File.Exists(Path.Combine(Application.persistentDataPath, saveFileName));
+ }
+ }
+}
diff --git a/unity/Assets/UI/SaveSystem.cs.meta b/unity/Assets/UI/SaveSystem.cs.meta
new file mode 100644
index 0000000..f857d90
--- /dev/null
+++ b/unity/Assets/UI/SaveSystem.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: XnoWtHuqUihinx6tGMjdkofi7dRhZE+34X4QUIkChIFcacunTLquUfM=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UI/SceneBGM.cs b/unity/Assets/UI/SceneBGM.cs
new file mode 100644
index 0000000..df0ff59
--- /dev/null
+++ b/unity/Assets/UI/SceneBGM.cs
@@ -0,0 +1,22 @@
+using UnityEngine;
+
+namespace GameFramework
+{
+ ///
+ /// 挂到每个场景中的一个空物件上,在 Start 时通知 AudioManager 播放该场景的 BGM。
+ /// 这样每个场景可以拥有独立的背景音乐。
+ ///
+ public class SceneBGM : MonoBehaviour
+ {
+ [SerializeField] AudioClip bgmClip;
+
+ [SerializeField] bool restartIfSameClip = false;
+
+ void Start()
+ {
+ if (bgmClip == null) return;
+ if (AudioManager.Instance != null)
+ AudioManager.Instance.PlayBGM(bgmClip, restartIfSameClip);
+ }
+ }
+}
diff --git a/unity/Assets/UI/SceneBGM.cs.meta b/unity/Assets/UI/SceneBGM.cs.meta
new file mode 100644
index 0000000..e13fce6
--- /dev/null
+++ b/unity/Assets/UI/SceneBGM.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: XnoftiOlVi4S3gMTUx4V/hoDxHkZdUwI+zo55+CZeToQ88/hCv3/9Ak=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UI/SceneLoader.cs b/unity/Assets/UI/SceneLoader.cs
new file mode 100644
index 0000000..fa86655
--- /dev/null
+++ b/unity/Assets/UI/SceneLoader.cs
@@ -0,0 +1,76 @@
+using System.Collections;
+using UnityEngine;
+using UnityEngine.SceneManagement;
+using UnityEngine.UI;
+
+namespace GameFramework
+{
+ ///
+ /// 场景异步加载器(持久化单例)。带黑色淡入淡出过渡。
+ /// 场景名可在 Inspector 配置,默认 MainMenu / Gameplay / Scoring。
+ ///
+ /// 搭建:把 SceneLoader 挂到一个空物体上(放第一个场景 MainMenu 里),
+ /// 它会 DontDestroyOnLoad。transitionImage 是它子物体 Canvas 上的 Image(全屏黑),
+ /// Canvas 设为 Screen Space - Overlay、sortingOrder 设很高(如 1000)。
+ ///
+ public class SceneLoader : PersistentSingleton
+ {
+ [Header("过渡")]
+ [SerializeField] private Image transitionImage;
+ [SerializeField] private float fadeTime = 1.5f;
+
+ [Header("场景名(按你工程里的实际名称填)")]
+ [SerializeField] private string mainMenuScene = "MainMenu";
+ [SerializeField] private string gameplayScene = "Gameplay";
+ [SerializeField] private string scoringScene = "Scoring";
+
+ private Color color;
+
+ public void LoadGameplayScene() => Load(gameplayScene);
+ public void LoadMainMenuScene() => Load(mainMenuScene);
+ public void LoadScoringScene() => Load(scoringScene);
+ public void Load(string sceneName)
+ {
+ StopAllCoroutines();
+ StartCoroutine(LoadingCoroutine(sceneName));
+ }
+
+ private IEnumerator LoadingCoroutine(string sceneName)
+ {
+ var loadingOperation = SceneManager.LoadSceneAsync(sceneName);
+ loadingOperation.allowSceneActivation = false;
+
+ if (transitionImage != null)
+ {
+ transitionImage.gameObject.SetActive(true);
+ color = transitionImage.color;
+ color.a = 0f;
+
+ // 淡入到黑
+ while (color.a < 1f)
+ {
+ color.a = Mathf.Clamp01(color.a + Time.unscaledDeltaTime / fadeTime);
+ transitionImage.color = color;
+ yield return null;
+ }
+ }
+
+ // 等异步加载到 90%
+ yield return new WaitUntil(() => loadingOperation.progress >= 0.9f);
+
+ loadingOperation.allowSceneActivation = true;
+
+ if (transitionImage != null)
+ {
+ // 淡出到透明
+ while (color.a > 0f)
+ {
+ color.a = Mathf.Clamp01(color.a - Time.unscaledDeltaTime / fadeTime);
+ transitionImage.color = color;
+ yield return null;
+ }
+ transitionImage.gameObject.SetActive(false);
+ }
+ }
+ }
+}
diff --git a/unity/Assets/UI/SceneLoader.cs.meta b/unity/Assets/UI/SceneLoader.cs.meta
new file mode 100644
index 0000000..928b412
--- /dev/null
+++ b/unity/Assets/UI/SceneLoader.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: Dyscsn6uBnk4QvVCnUgEfdjebHgB1cCPXqzAMAYCA/MOi0LDY+gbze4=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UI/ScoreDisplay.cs b/unity/Assets/UI/ScoreDisplay.cs
new file mode 100644
index 0000000..55a7ce5
--- /dev/null
+++ b/unity/Assets/UI/ScoreDisplay.cs
@@ -0,0 +1,42 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace GameFramework
+{
+ ///
+ /// 得分显示组件。
+ /// 订阅 ScoreManager.onScoreChanged 事件,自动更新 Text。
+ /// 挂到场景中带有 Text 组件的 Canvas 元素上即可。
+ ///
+ public class ScoreDisplay : MonoBehaviour
+ {
+ [SerializeField] Text scoreText;
+ [SerializeField] string format = "{0}";
+
+ void OnEnable()
+ {
+ ScoreManager.onScoreChanged += UpdateText;
+ }
+
+ void OnDisable()
+ {
+ ScoreManager.onScoreChanged -= UpdateText;
+ }
+
+ void Start()
+ {
+ if (scoreText == null)
+ scoreText = GetComponent();
+ if (ScoreManager.Instance != null)
+ UpdateText(ScoreManager.Instance.CurrentScore);
+ else
+ UpdateText(0);
+ }
+
+ void UpdateText(int score)
+ {
+ if (scoreText != null)
+ scoreText.text = string.Format(format, score);
+ }
+ }
+}
diff --git a/unity/Assets/UI/ScoreDisplay.cs.meta b/unity/Assets/UI/ScoreDisplay.cs.meta
new file mode 100644
index 0000000..f38f675
--- /dev/null
+++ b/unity/Assets/UI/ScoreDisplay.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: XXgasH+tByg20yGkac4QlsGkLlhL3NQFuRiqy5rX5WQQlWzjXcSBwQY=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UI/ScoreManager.cs b/unity/Assets/UI/ScoreManager.cs
new file mode 100644
index 0000000..4281949
--- /dev/null
+++ b/unity/Assets/UI/ScoreManager.cs
@@ -0,0 +1,162 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace GameFramework
+{
+ ///
+ /// 单条玩家得分记录。
+ ///
+ [Serializable]
+ public class PlayerScore
+ {
+ public int score;
+ public string playerName;
+
+ public PlayerScore(int score, string playerName)
+ {
+ this.score = score;
+ this.playerName = playerName;
+ }
+ }
+
+ ///
+ /// 可序列化的玩家得分列表(用于 JSON 存档)。
+ ///
+ [Serializable]
+ public class PlayerScoreData
+ {
+ public List list = new List();
+ }
+
+ ///
+ /// 得分管理器(持久单例)。
+ /// 维护当前局得分,通过事件通知 UI,并管理 Top-10 排行榜存档。
+ ///
+ public class ScoreManager : PersistentSingleton
+ {
+ const int LEADERBOARD_SIZE = 10;
+ const string SAVE_FILE = "leaderboard.json";
+
+ // 当前局得分
+ int currentScore = 0;
+
+ // 当得分变化时触发,参数为最新得分(动画过程中的中间值也会触发)
+ public static event Action onScoreChanged;
+ // 当得分完成最终增加时触发,参数为最终得分
+ public static event Action onScoreSettled;
+
+ /// 当前得分(只读)。
+ public int CurrentScore => currentScore;
+
+ /// 默认玩家名,可在 Inspector 设置。
+ [SerializeField] string defaultPlayerName = "Player";
+
+ protected override void Awake()
+ {
+ base.Awake();
+ if (Instance != this) return;
+ currentScore = 0;
+ }
+
+ ///
+ /// 增加得分(带数字滚动动画)。
+ ///
+ public void AddScore(int amount)
+ {
+ if (amount <= 0) return;
+ StartCoroutine(ScoreCountUpCoroutine(currentScore, currentScore + amount));
+ }
+
+ ///
+ /// 直接设置得分(无动画)。
+ ///
+ public void SetScore(int value)
+ {
+ currentScore = Mathf.Max(0, value);
+ onScoreChanged?.Invoke(currentScore);
+ onScoreSettled?.Invoke(currentScore);
+ }
+
+ ///
+ /// 重置当前局得分。
+ ///
+ public void ResetScore()
+ {
+ currentScore = 0;
+ onScoreChanged?.Invoke(0);
+ onScoreSettled?.Invoke(0);
+ }
+
+ IEnumerator ScoreCountUpCoroutine(int from, int to)
+ {
+ currentScore = to;
+ float duration = 0.5f;
+ float elapsed = 0f;
+
+ while (elapsed < duration)
+ {
+ elapsed += Time.unscaledDeltaTime;
+ float t = Mathf.Clamp01(elapsed / duration);
+ int display = Mathf.RoundToInt(Mathf.Lerp(from, to, t));
+ onScoreChanged?.Invoke(display);
+ yield return null;
+ }
+
+ onScoreChanged?.Invoke(to);
+ onScoreSettled?.Invoke(to);
+ }
+
+ #region 排行榜
+ ///
+ /// 当前得分是否能进入排行榜 Top-10。
+ ///
+ public bool HasNewHighScore
+ {
+ get
+ {
+ var data = LoadPlayerScoreData();
+ if (data.list.Count < LEADERBOARD_SIZE)
+ return true;
+ return currentScore > data.list[LEADERBOARD_SIZE - 1].score;
+ }
+ }
+
+ ///
+ /// 将当前得分以指定名字保存到排行榜。
+ /// 排行榜按分数降序排列,只保留 Top-10。
+ ///
+ public void SavePlayerScore(string playerName)
+ {
+ if (string.IsNullOrEmpty(playerName))
+ playerName = defaultPlayerName;
+
+ var data = LoadPlayerScoreData();
+ data.list.Add(new PlayerScore(currentScore, playerName));
+ data.list.Sort((a, b) => b.score.CompareTo(a.score));
+ if (data.list.Count > LEADERBOARD_SIZE)
+ data.list.RemoveRange(LEADERBOARD_SIZE, data.list.Count - LEADERBOARD_SIZE);
+ SaveSystem.Save(SAVE_FILE, data);
+ }
+
+ ///
+ /// 读取排行榜数据。
+ ///
+ public PlayerScoreData LoadPlayerScoreData()
+ {
+ if (SaveSystem.SaveFileExists(SAVE_FILE))
+ return SaveSystem.Load(SAVE_FILE);
+ return new PlayerScoreData();
+ }
+
+ ///
+ /// 清空排行榜存档。
+ ///
+ public void ClearLeaderboard()
+ {
+ SaveSystem.DeleteSaveFile(SAVE_FILE);
+ }
+ #endregion
+ }
+}
diff --git a/unity/Assets/UI/ScoreManager.cs.meta b/unity/Assets/UI/ScoreManager.cs.meta
new file mode 100644
index 0000000..52e407a
--- /dev/null
+++ b/unity/Assets/UI/ScoreManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: DC8WvSKkVSrxM9wqXumasT97xw7kTfGqUXXPsJ9DSMckQZ9SK7ZNkOI=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UI/ScorePickup.cs b/unity/Assets/UI/ScorePickup.cs
new file mode 100644
index 0000000..370dbba
--- /dev/null
+++ b/unity/Assets/UI/ScorePickup.cs
@@ -0,0 +1,68 @@
+using UnityEngine;
+
+namespace GameFramework
+{
+ ///
+ /// 得分拾取物。
+ /// 玩家碰到(OnTriggerEnter + tag="Player")后加分、播音效、隐藏自身。
+ /// 可自动复位(可选),用于不吃豆就复活的场景。
+ ///
+ public class ScorePickup : MonoBehaviour
+ {
+ [SerializeField] int scoreValue = 10;
+ [SerializeField] AudioData pickUpSFX;
+ [SerializeField] float respawnTime = 0f; // 0=不复活(永久消失)
+
+ [Header("Auto Assign")]
+ [SerializeField] bool findScoreManagerAutomatically = true;
+
+ Collider pickupCollider;
+ MeshRenderer meshRenderer;
+
+ void Awake()
+ {
+ pickupCollider = GetComponent();
+ meshRenderer = GetComponentInChildren();
+ // 确保有触发器
+ if (pickupCollider != null)
+ pickupCollider.isTrigger = true;
+ }
+
+ void OnTriggerEnter(Collider other)
+ {
+ if (!other.CompareTag("Player")) return;
+
+ // 加分
+ if (ScoreManager.Instance != null)
+ ScoreManager.Instance.AddScore(scoreValue);
+
+ // 音效
+ if (AudioManager.Instance != null && pickUpSFX != null)
+ AudioManager.Instance.PlaySFX(pickUpSFX);
+
+ // 隐藏/复活
+ if (respawnTime > 0f)
+ {
+ SetVisible(false);
+ Invoke(nameof(Respawn), respawnTime);
+ }
+ else
+ {
+ gameObject.SetActive(false);
+ }
+ }
+
+ void SetVisible(bool visible)
+ {
+ if (pickupCollider != null)
+ pickupCollider.enabled = visible;
+ if (meshRenderer != null)
+ meshRenderer.enabled = visible;
+ }
+
+ void Respawn()
+ {
+ SetVisible(true);
+ }
+ }
+}
diff --git a/unity/Assets/UI/ScorePickup.cs.meta b/unity/Assets/UI/ScorePickup.cs.meta
new file mode 100644
index 0000000..15ffaf8
--- /dev/null
+++ b/unity/Assets/UI/ScorePickup.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: XHMfsiKkWyrjymEGDTiE6sqx10eLr1STeHe+ivg7t7be5KBxWCOljj0=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UI/ScoringUIController.cs b/unity/Assets/UI/ScoringUIController.cs
new file mode 100644
index 0000000..9349825
--- /dev/null
+++ b/unity/Assets/UI/ScoringUIController.cs
@@ -0,0 +1,193 @@
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace GameFramework
+{
+ ///
+ /// 排行榜场景 UI 控制器。
+ /// 如果当前得分能进入 Top-10,先显示输入名字面板;
+ /// 否则直接显示排行榜。
+ /// 修复了源项目 ScoringUIController 中 ShowScoringScreen() 被调用两次的 bug。
+ ///
+ public class ScoringUIController : MonoBehaviour
+ {
+ [Header("Panels")]
+ [SerializeField] GameObject leaderboardPanel;
+ [SerializeField] GameObject newHighScorePanel;
+
+ [Header("Leaderboard")]
+ [SerializeField] Transform leaderboardContainer; // 包含10个条目的父物体
+ [SerializeField] Text finalScoreText; // 显示当前局最终得分
+
+ [Header("New High Score")]
+ [SerializeField] InputField nameInputField;
+ [SerializeField] Button submitButton;
+ [SerializeField] Button cancelButton;
+
+ [Header("Navigation")]
+ [SerializeField] Button mainMenuButton;
+
+ [Header("Audio")]
+ [SerializeField] AudioData submitSFX;
+ [SerializeField] AudioData cancelSFX;
+
+ void Start()
+ {
+ // 绑定按钮
+ if (submitButton != null)
+ submitButton.onClick.AddListener(OnSubmitClick);
+ if (cancelButton != null)
+ cancelButton.onClick.AddListener(OnCancelClick);
+ if (mainMenuButton != null)
+ mainMenuButton.onClick.AddListener(OnMainMenuClick);
+
+ // 初始隐藏所有面板
+ if (leaderboardPanel != null)
+ leaderboardPanel.SetActive(false);
+ if (newHighScorePanel != null)
+ newHighScorePanel.SetActive(false);
+
+ // 显示当前最终得分
+ if (finalScoreText != null && ScoreManager.Instance != null)
+ finalScoreText.text = ScoreManager.Instance.CurrentScore.ToString();
+
+ // 判断是否进入排行榜
+ // 只调用一次——修复源项目的双重调用 bug
+ if (ScoreManager.Instance != null && ScoreManager.Instance.HasNewHighScore)
+ {
+ ShowNewHighScorePanel();
+ }
+ else
+ {
+ ShowLeaderboard();
+ }
+ }
+
+ ///
+ /// 显示新纪录输入面板。
+ ///
+ void ShowNewHighScorePanel()
+ {
+ if (newHighScorePanel != null)
+ newHighScorePanel.SetActive(true);
+ if (leaderboardPanel != null)
+ leaderboardPanel.SetActive(false);
+
+ // 自动选中输入框
+ if (nameInputField != null)
+ {
+ nameInputField.text = "";
+ nameInputField.ActivateInputField();
+ }
+ }
+
+ ///
+ /// 显示排行榜。
+ ///
+ void ShowLeaderboard()
+ {
+ if (newHighScorePanel != null)
+ newHighScorePanel.SetActive(false);
+ if (leaderboardPanel != null)
+ leaderboardPanel.SetActive(true);
+
+ UpdateLeaderboardDisplay();
+
+ // 选中主菜单按钮(键盘导航用)
+ if (mainMenuButton != null)
+ mainMenuButton.Select();
+ }
+
+ ///
+ /// 更新排行榜显示。
+ /// 遍历 leaderboardContainer 下的子物体,设置排名/得分/名字。
+ /// 每个条目子物体需要有三个 Text 组件,分别在 Rank/Score/Name 子物体上。
+ ///
+ void UpdateLeaderboardDisplay()
+ {
+ if (ScoreManager.Instance == null) return;
+ if (leaderboardContainer == null) return;
+
+ var data = ScoreManager.Instance.LoadPlayerScoreData();
+ int count = Mathf.Min(data.list.Count, leaderboardContainer.childCount);
+
+ for (int i = 0; i < leaderboardContainer.childCount; i++)
+ {
+ Transform entry = leaderboardContainer.GetChild(i);
+ bool hasData = i < data.list.Count;
+
+ // 查找条目下的三个 Text
+ Text rankText = FindTextByName(entry, "Rank");
+ Text scoreText = FindTextByName(entry, "Score");
+ Text nameText = FindTextByName(entry, "Name");
+
+ if (hasData)
+ {
+ var score = data.list[i];
+ if (rankText != null) rankText.text = $"{i + 1}.";
+ if (scoreText != null) scoreText.text = score.score.ToString();
+ if (nameText != null) nameText.text = score.playerName;
+ entry.gameObject.SetActive(true);
+ }
+ else
+ {
+ if (rankText != null) rankText.text = $"{i + 1}.";
+ if (scoreText != null) scoreText.text = "---";
+ if (nameText != null) nameText.text = "---";
+ entry.gameObject.SetActive(true);
+ }
+ }
+ }
+
+ ///
+ /// 在子物体中按名称查找 Text 组件。
+ ///
+ Text FindTextByName(Transform parent, string name)
+ {
+ Transform t = parent.Find(name);
+ if (t != null)
+ return t.GetComponent();
+ // 如果条目本身就是单个 Text(没有子结构),返回自身
+ return parent.GetComponent();
+ }
+
+ #region Button Handlers
+ void OnSubmitClick()
+ {
+ string playerName = "";
+ if (nameInputField != null)
+ playerName = nameInputField.text;
+
+ if (string.IsNullOrEmpty(playerName))
+ playerName = "Player";
+
+ if (ScoreManager.Instance != null)
+ ScoreManager.Instance.SavePlayerScore(playerName);
+
+ if (AudioManager.Instance != null && submitSFX != null)
+ AudioManager.Instance.PlaySFX(submitSFX);
+
+ ShowLeaderboard();
+ }
+
+ void OnCancelClick()
+ {
+ // 取消 = 用默认名保存后显示排行榜
+ if (ScoreManager.Instance != null)
+ ScoreManager.Instance.SavePlayerScore("Player");
+
+ if (AudioManager.Instance != null && cancelSFX != null)
+ AudioManager.Instance.PlaySFX(cancelSFX);
+
+ ShowLeaderboard();
+ }
+
+ void OnMainMenuClick()
+ {
+ if (SceneLoader.Instance != null)
+ SceneLoader.Instance.LoadMainMenuScene();
+ }
+ #endregion
+ }
+}
diff --git a/unity/Assets/UI/ScoringUIController.cs.meta b/unity/Assets/UI/ScoringUIController.cs.meta
new file mode 100644
index 0000000..2935bc3
--- /dev/null
+++ b/unity/Assets/UI/ScoringUIController.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: W34bsX/7Wy1ExDIK2gVfkr7HYzOwXi//jKqEeettI8EJBU/quoNe7R8=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UI/Singleton.cs b/unity/Assets/UI/Singleton.cs
new file mode 100644
index 0000000..56526f9
--- /dev/null
+++ b/unity/Assets/UI/Singleton.cs
@@ -0,0 +1,17 @@
+using UnityEngine;
+
+namespace GameFramework
+{
+ ///
+ /// 场景级单例基类。每个场景里只存在一个实例,切场景后不保留。
+ ///
+ public class Singleton : MonoBehaviour where T : Component
+ {
+ public static T Instance { get; private set; }
+
+ protected virtual void Awake()
+ {
+ Instance = this as T;
+ }
+ }
+}
diff --git a/unity/Assets/UI/Singleton.cs.meta b/unity/Assets/UI/Singleton.cs.meta
new file mode 100644
index 0000000..2a76872
--- /dev/null
+++ b/unity/Assets/UI/Singleton.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: DSke5C3/Ui2rwbIReBtztfYr2wcvt/9+Lt+vNrdIhkeQ+/WSFb3KT7k=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UI/TimeController.cs b/unity/Assets/UI/TimeController.cs
new file mode 100644
index 0000000..48e8d7d
--- /dev/null
+++ b/unity/Assets/UI/TimeController.cs
@@ -0,0 +1,24 @@
+using UnityEngine;
+
+namespace GameFramework
+{
+ ///
+ /// 时间控制器(场景级单例)。负责暂停/恢复(Time.timeScale)。
+ /// 源项目的子弹时间逻辑已移除,只保留暂停。
+ ///
+ public class TimeController : Singleton
+ {
+ private float timeScaleBeforePause = 1f;
+
+ public void Pause()
+ {
+ timeScaleBeforePause = Time.timeScale;
+ Time.timeScale = 0f;
+ }
+
+ public void Unpause()
+ {
+ Time.timeScale = timeScaleBeforePause > 0f ? timeScaleBeforePause : 1f;
+ }
+ }
+}
diff --git a/unity/Assets/UI/TimeController.cs.meta b/unity/Assets/UI/TimeController.cs.meta
new file mode 100644
index 0000000..1d55b1d
--- /dev/null
+++ b/unity/Assets/UI/TimeController.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: Xi5M5HipV3ITPzlXa/Jgdtl3/zjZiWQ9EukfLBaa2ygvlKHBz/lGi8U=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/UI/UIEventTrigger.cs b/unity/Assets/UI/UIEventTrigger.cs
new file mode 100644
index 0000000..a60ad69
--- /dev/null
+++ b/unity/Assets/UI/UIEventTrigger.cs
@@ -0,0 +1,45 @@
+using UnityEngine;
+using UnityEngine.EventSystems;
+
+namespace GameFramework
+{
+ ///
+ /// UI 事件音效触发器。
+ /// 挂到按钮上,鼠标悬停/选中时播放 selectSFX,点击/提交时播放 submitSFX。
+ ///
+ public class UIEventTrigger : MonoBehaviour,
+ IPointerEnterHandler,
+ IPointerDownHandler,
+ ISelectHandler,
+ ISubmitHandler
+ {
+ [SerializeField] AudioData selectSFX;
+ [SerializeField] AudioData submitSFX;
+
+ public void OnPointerEnter(PointerEventData eventData)
+ {
+ PlaySFX(selectSFX);
+ }
+
+ public void OnPointerDown(PointerEventData eventData)
+ {
+ PlaySFX(submitSFX);
+ }
+
+ public void OnSelect(BaseEventData eventData)
+ {
+ PlaySFX(selectSFX);
+ }
+
+ public void OnSubmit(BaseEventData eventData)
+ {
+ PlaySFX(submitSFX);
+ }
+
+ void PlaySFX(AudioData data)
+ {
+ if (AudioManager.Instance != null && data != null)
+ AudioManager.Instance.PlaySFX(data);
+ }
+ }
+}
diff --git a/unity/Assets/UI/UIEventTrigger.cs.meta b/unity/Assets/UI/UIEventTrigger.cs.meta
new file mode 100644
index 0000000..cc71054
--- /dev/null
+++ b/unity/Assets/UI/UIEventTrigger.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: Xi8btCqoUX6kUJTWKBTy8tU139tZU/LcCXUb+S3KlOlgTgOA/0wpsGI=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/ProjectSettings/EditorBuildSettings.asset b/unity/ProjectSettings/EditorBuildSettings.asset
index 92372bf..fb32a17 100644
--- a/unity/ProjectSettings/EditorBuildSettings.asset
+++ b/unity/ProjectSettings/EditorBuildSettings.asset
@@ -1,13 +1,27 @@
%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
+%TAG !u! tag:yousandi.cn,2023:
--- !u!1045 &1
EditorBuildSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Scenes:
- enabled: 1
- path: Assets/2.5D Engine/Demo Scene/DEMO 1.unity
- guid: 99c9720ab356a0642a771bea13969a05
+ path: Assets/Scenes/MainMenu.unity
+ guid: a8692b9b19ec95b48918246882a64c8c
+ - enabled: 1
+ path: Assets/Scenes/Gameplay.unity
+ guid: 9de73b30b85a6e049aa627b90c7a30af
+ - enabled: 1
+ path: Assets/Scenes/Scoring.scene
+ guid: 9fc0d4010bbf28b4594072e72b8655ab
+ m_BuildProfiles: []
m_configObjects:
com.unity.input.settings.actions: {fileID: -944628639613478452, guid: 1581d80d30bc9f14f8be5e0a8b72fc79, type: 3}
- m_UseUCBPForAssetBundles: 0
+ m_SlimFeaturesWeixinMiniGame:
+ AllocateOverhead: 1
+ DecompressASTC: 0
+ DecompressDXT: 1
+ DecompressETC: 1
+ FreeTypeSfntPng: 1
+ LightProbe: 2
+ UseStringInternPool: 2
diff --git a/unity/UserSettings/EditorUserSettings.asset b/unity/UserSettings/EditorUserSettings.asset
index ce6c492..bb045d1 100644
--- a/unity/UserSettings/EditorUserSettings.asset
+++ b/unity/UserSettings/EditorUserSettings.asset
@@ -15,17 +15,17 @@ EditorUserSettings:
value: 50025251565751035a5b0a7b44250944144f4e7d7d787336782a4a37b6b7606f
flags: 0
RecentlyUsedSceneGuid-3:
- value: 5004505e50045a0e5f57097b14250f444615407b287b7e657f704c31b5b36660
- flags: 0
- RecentlyUsedSceneGuid-4:
value: 5b090d000402580a5c5b087648735e4445151e737b717334757b1832b1b93261
flags: 0
- RecentlyUsedSceneGuid-5:
+ RecentlyUsedSceneGuid-4:
value: 5055070050010c5a0e5d0d27497a0e441016412c2f7d206178714f61b3b8326b
flags: 0
- RecentlyUsedSceneGuid-6:
+ RecentlyUsedSceneGuid-5:
value: 5a5757560101590a5d0c0e24427b5d44434e4c7a7b7a23677f2b4565b7b5353a
flags: 0
+ RecentlyUsedSceneGuid-6:
+ value: 0209025f575750595c57092149765d444e4e49727e7c7068757b1c65b6e36c3b
+ flags: 0
RecentlyUsedSceneGuid-7:
value: 5a55515156575a0b0f56592346260f444f16197c7e7f24697d2a4a32b1b0353e
flags: 0