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