diff --git a/unity/Assets/Light/shaders/IndianOcean_DarknessOverlay.mat b/unity/Assets/Light/shaders/IndianOcean_DarknessOverlay.mat index 93efba6..2abee3a 100644 --- a/unity/Assets/Light/shaders/IndianOcean_DarknessOverlay.mat +++ b/unity/Assets/Light/shaders/IndianOcean_DarknessOverlay.mat @@ -31,7 +31,7 @@ Material: - _EchoRadius: 39.41617 - _EchoWidth: 2.5 - _LightSoftness: 1 - - _MinBrightness: 1 + - _MinBrightness: 0 m_Colors: - _DarknessColor: {r: 0.01, g: 0.01, b: 0.02, a: 1} - _EchoCenter: {r: -2.4399998, g: -1.5000057, b: 0, a: 0} diff --git a/unity/Assets/Scenes/Gameplay.unity b/unity/Assets/Scenes/Gameplay.unity index d155e12..8d5d5c5 100644 --- a/unity/Assets/Scenes/Gameplay.unity +++ b/unity/Assets/Scenes/Gameplay.unity @@ -155,7 +155,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: darknessMaterial: {fileID: 2100000, guid: 6dd18d2379aff3040813ab8005b1898a, type: 2} - debugShowAll: 1 + debugShowAll: 0 minBrightness: 0 darknessColor: {r: 0.01, g: 0.01, b: 0.02, a: 1} lightSoftness: 1 @@ -684,6 +684,94 @@ Transform: m_CorrespondingSourceObject: {fileID: 8451410411389343811, guid: 3b47d748441aeb64da7d88325a75f1b7, type: 3} m_PrefabInstance: {fileID: 59130222} m_PrefabAsset: {fileID: 0} +--- !u!1 &68438037 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 7 + m_Component: + - component: {fileID: 68438038} + - component: {fileID: 68438039} + m_Layer: 0 + m_HasEditorInfo: 1 + m_Name: lost + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &68438038 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 68438037} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -14, y: 61, z: 0} + m_LocalScale: {x: 1.706414, y: 1.706414, z: 1.706414} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 922024178} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!212 &68438039 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 68438037} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_virtualGeometry: 0 + m_virtualGeometryShadow: 0 + m_ShadingRate: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10754, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 21300000, guid: 0f01c8b108b020b4ea35929b92863b2d, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 11.69, y: 2.43} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 --- !u!1 &68702802 GameObject: m_ObjectHideFlags: 0 @@ -968,6 +1056,61 @@ SpriteRenderer: m_WasSpriteAssigned: 1 m_MaskInteraction: 0 m_SpriteSortPoint: 0 +--- !u!1 &73055213 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 7 + m_Component: + - component: {fileID: 73055215} + - component: {fileID: 73055214} + m_Layer: 0 + m_HasEditorInfo: 1 + m_Name: GameLostOverlay + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &73055214 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 73055213} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df2d86b87f5cbe544afe33a8c0c10abf, type: 3} + m_Name: + m_EditorClassIdentifier: + lostCanvas: {fileID: 1430258823} + dimBackground: {fileID: 637101930} + lostTitleText: {fileID: 0} + lostTitleImage: {fileID: 0} + leftDecoration: {fileID: 0} + rightDecoration: {fileID: 0} + mainMenuButton: {fileID: 549601800} + mainMenuButtonImage: {fileID: 549601797} + lostSFX: {fileID: 0} +--- !u!4 &73055215 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 73055213} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 562.5, y: 316.5, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1430258820} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &74360023 GameObject: m_ObjectHideFlags: 0 @@ -3035,6 +3178,86 @@ Transform: m_CorrespondingSourceObject: {fileID: 8451410411389343811, guid: 3b47d748441aeb64da7d88325a75f1b7, type: 3} m_PrefabInstance: {fileID: 221625452} m_PrefabAsset: {fileID: 0} +--- !u!1 &224985235 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 7 + m_Component: + - component: {fileID: 224985236} + - component: {fileID: 224985238} + - component: {fileID: 224985237} + m_Layer: 0 + m_HasEditorInfo: 1 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &224985236 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 224985235} + 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: 549601799} + 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 &224985237 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 224985235} + 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: 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 28 + 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: "\u4E3B\u754C\u9762" +--- !u!222 &224985238 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 224985235} + m_CullTransparentMesh: 1 --- !u!1001 &232215155 PrefabInstance: m_ObjectHideFlags: 0 @@ -7723,6 +7946,128 @@ Transform: m_CorrespondingSourceObject: {fileID: 7680868130656722617, guid: c7b9040437d4deb498301bedac7ec47b, type: 3} m_PrefabInstance: {fileID: 1560771471} m_PrefabAsset: {fileID: 0} +--- !u!1 &549601796 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 7 + m_Component: + - component: {fileID: 549601799} + - component: {fileID: 549601798} + - component: {fileID: 549601797} + - component: {fileID: 549601800} + m_Layer: 0 + m_HasEditorInfo: 1 + m_Name: MainMenuButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &549601797 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 549601796} + 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: 0.2} + 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: 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 &549601798 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 549601796} + m_CullTransparentMesh: 1 +--- !u!224 &549601799 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 549601796} + 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: 224985236} + m_Father: {fileID: 1490576152} + 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: -80} + m_SizeDelta: {x: 200, y: 60} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &549601800 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 549601796} + 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: 1.2, g: 1.2, b: 1.2, a: 1} + m_PressedColor: {r: 0.8, g: 0.8, b: 0.8, 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: 549601797} + m_OnClick: + m_PersistentCalls: + m_Calls: [] --- !u!1 &550853233 GameObject: m_ObjectHideFlags: 0 @@ -9917,6 +10262,82 @@ Transform: - {fileID: 563108172} m_Father: {fileID: 505134148} m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!1 &637101927 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 7 + m_Component: + - component: {fileID: 637101928} + - component: {fileID: 637101929} + - component: {fileID: 637101930} + m_Layer: 0 + m_HasEditorInfo: 1 + m_Name: DimBackground + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &637101928 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 637101927} + 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: 1430258820} + 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!222 &637101929 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 637101927} + m_CullTransparentMesh: 1 +--- !u!114 &637101930 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 637101927} + 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: 0.6} + 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: 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!1 &638120131 GameObject: m_ObjectHideFlags: 0 @@ -15225,6 +15646,43 @@ SpriteRenderer: m_WasSpriteAssigned: 1 m_MaskInteraction: 0 m_SpriteSortPoint: 0 +--- !u!1 &922024177 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 7 + m_Component: + - component: {fileID: 922024178} + m_Layer: 0 + m_HasEditorInfo: 1 + m_Name: LostTitle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &922024178 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 922024177} + 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: 68438038} + m_Father: {fileID: 1490576152} + 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: 30} + m_SizeDelta: {x: 800, y: 120} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &932470540 GameObject: m_ObjectHideFlags: 0 @@ -21296,9 +21754,7 @@ MonoBehaviour: m_EditorClassIdentifier: gameOverCanvas: {fileID: 0} confirmButton: {fileID: 0} - gameOverSFX: - audioClip: {fileID: 8300000, guid: 370972ec1bb4cc64e8a96ce64057334c, type: 3} - volume: 1 + gameOverSFX: {fileID: 0} confirmKey: 13 --- !u!114 &1357460803 MonoBehaviour: @@ -21320,12 +21776,8 @@ MonoBehaviour: mainMenuButton: {fileID: 0} settingsPanel: {fileID: 1647702926} settingsBackButton: {fileID: 1471976511} - pauseSFX: - audioClip: {fileID: 8300000, guid: 370972ec1bb4cc64e8a96ce64057334c, type: 3} - volume: 1 - unpauseSFX: - audioClip: {fileID: 8300000, guid: 6940b0d02566470418c2e593a6ff04c7, type: 3} - volume: 1 + pauseSFX: {fileID: 0} + unpauseSFX: {fileID: 0} --- !u!4 &1357460804 Transform: m_ObjectHideFlags: 0 @@ -22037,6 +22489,8 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: gameState: 0 + lightShrinkDuration: 2 + lostFadeOutDuration: 1 lightExpandDuration: 1.5 lightExpandTargetRadius: 20 fadeOutDuration: 1 @@ -23001,6 +23455,110 @@ Transform: m_CorrespondingSourceObject: {fileID: 8451410411389343811, guid: 3b47d748441aeb64da7d88325a75f1b7, type: 3} m_PrefabInstance: {fileID: 1430120389} m_PrefabAsset: {fileID: 0} +--- !u!1 &1430258819 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 7 + m_Component: + - component: {fileID: 1430258820} + - component: {fileID: 1430258823} + - component: {fileID: 1430258822} + - component: {fileID: 1430258821} + m_Layer: 0 + m_HasEditorInfo: 1 + m_Name: LostCanvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1430258820 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1430258819} + 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: 637101928} + - {fileID: 1490576152} + m_Father: {fileID: 73055215} + 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 &1430258821 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1430258819} + 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 &1430258822 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1430258819} + 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.5 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1430258823 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1430258819} + 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: -31072 + m_TargetDisplay: 0 --- !u!1001 &1431146158 PrefabInstance: m_ObjectHideFlags: 0 @@ -24177,12 +24735,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: ae410525a1083304f99715898b5338e5, type: 3} m_Name: m_EditorClassIdentifier: - selectSFX: - audioClip: {fileID: 8300000, guid: 370972ec1bb4cc64e8a96ce64057334c, type: 3} - volume: 1 - submitSFX: - audioClip: {fileID: 8300000, guid: 6940b0d02566470418c2e593a6ff04c7, type: 3} - volume: 1 + selectSFX: {fileID: 0} + submitSFX: {fileID: 0} --- !u!222 &1471976514 CanvasRenderer: m_ObjectHideFlags: 0 @@ -24211,6 +24765,44 @@ RectTransform: m_AnchoredPosition: {x: 0, y: -15} m_SizeDelta: {x: 160, y: 30} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1490576151 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 7 + m_Component: + - component: {fileID: 1490576152} + m_Layer: 0 + m_HasEditorInfo: 1 + m_Name: CenterPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1490576152 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1490576151} + 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: 922024178} + - {fileID: 549601799} + m_Father: {fileID: 1430258820} + 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: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &1497032769 GameObject: m_ObjectHideFlags: 0 @@ -34107,3 +34699,4 @@ SceneRoots: - {fileID: 1112109402} - {fileID: 1385715428} - {fileID: 733855062} + - {fileID: 73055215} diff --git a/unity/Assets/UI/Art/ResultScreen/lost.png b/unity/Assets/UI/Art/ResultScreen/lost.png new file mode 100644 index 0000000..5074e58 Binary files /dev/null and b/unity/Assets/UI/Art/ResultScreen/lost.png differ diff --git a/unity/Assets/UI/Art/ResultScreen/lost.png.meta b/unity/Assets/UI/Art/ResultScreen/lost.png.meta new file mode 100644 index 0000000..7d4613f --- /dev/null +++ b/unity/Assets/UI/Art/ResultScreen/lost.png.meta @@ -0,0 +1,133 @@ +fileFormatVersion: 2 +guid: DywftHmlAXoLsWpW/3FmzSlaa7pipOD+KA4oePRPvSGjv0lXt9T9tIQ= +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + webStreaming: 0 + priorityLevel: 0 + uploadedMode: 2 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + maxPlaceholderSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + maxPlaceholderSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + maxPlaceholderSize: 32 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/Assets/UI/GameLostOverlay.cs b/unity/Assets/UI/GameLostOverlay.cs new file mode 100644 index 0000000..3508e49 --- /dev/null +++ b/unity/Assets/UI/GameLostOverlay.cs @@ -0,0 +1,628 @@ +using System.Collections; +using UnityEngine; +using UnityEngine.UI; +using UnityEngine.SceneManagement; + +namespace GameFramework +{ + /// + /// 游戏失败叠加层 —— 直接挂在 Gameplay 场景的 Canvas 上。 + /// + /// 使用方式: + /// 1. 在 Gameplay 场景里创建一个空物体,挂上本脚本 + /// 2. 运行一次游戏(或点 Editor 按钮),脚本会自动构建子 UI + /// 3. 停止运行后,子 UI 留在场景中,可自由编辑样式/位置/精灵 + /// 4. 运行时由 GameManager 调用 GameLostOverlay.Show() 激活 + /// + /// 所有 UI 元素均为 [SerializeField],可在 Inspector 中替换。 + /// + public class GameLostOverlay : MonoBehaviour + { + private static GameLostOverlay _instance; + + // ====== Canvas ====== + [Header("Canvas(留空则自动创建)")] + [SerializeField] private Canvas lostCanvas; + + // ====== UI 元素引用(全部可编辑) ====== + [Header("背景蒙版")] + [SerializeField] private Image dimBackground; + + [Header("标题 —— 你已迷失……")] + [SerializeField] private Text lostTitleText; + [SerializeField] private Image lostTitleImage; // 可用图片替代文字 + + [Header("装饰")] + [SerializeField] private Image leftDecoration; + [SerializeField] private Image rightDecoration; + + [Header("主界面按钮")] + [SerializeField] private Button mainMenuButton; + [SerializeField] private Image mainMenuButtonImage; + + [Header("音效")] + [SerializeField] private AudioData lostSFX; + + [Header("标题渐现动效")] + [Tooltip("标题渐现总时长(秒)")] + [SerializeField] private float titleFadeDuration = 1.5f; + [Tooltip("水面波纹位置抖动幅度(像素)")] + [SerializeField] private float ripplePositionAmplitude = 8f; + [Tooltip("水面波纹缩放抖动幅度")] + [SerializeField] private float rippleScaleAmplitude = 0.08f; + [Tooltip("水面波纹频率(越大抖动越快)")] + [SerializeField] private float rippleFrequency = 15f; + [Tooltip("水波纹材质(留空则自动从 Shader 创建)")] + [SerializeField] private Material rippleMaterial; + [Tooltip("主界面按钮延迟出现时间(秒)")] + [SerializeField] private float buttonFadeDelay = 2f; + [Tooltip("按钮渐现时长(秒)")] + [SerializeField] private float buttonFadeDuration = 0.5f; + + private bool _isVisible; + private Coroutine _titleAnimCoroutine; + private Coroutine _buttonFadeCoroutine; + private Material _rippleMaterial; + + // ==================================================================== + // 静态入口 + // ==================================================================== + + /// + /// 显示失败叠加层。优先使用场景中已有的实例, + /// 没有则动态创建一个。 + /// + public static void Show() + { + // 场景中已有(隐藏的)实例? + if (_instance != null) + { + _instance.Activate(); + return; + } + + // 尝试在场景中找到 + var found = FindObjectOfType(); + if (found != null) + { + _instance = found; + found.Activate(); + return; + } + + // 都没有 → 动态创建 + var obj = new GameObject("GameLostOverlay"); + var overlay = obj.AddComponent(); + overlay.BuildAll(); + overlay.Activate(); + } + + // ==================================================================== + // 生命周期 + // ==================================================================== + + void Awake() + { + _instance = this; + + // 如果 Canvas 还没赋值,尝试从自身获取 + if (lostCanvas == null) + lostCanvas = GetComponent(); + + // 初始隐藏 + if (lostCanvas != null) + lostCanvas.enabled = false; + } + + void Update() + { + if (!_isVisible) return; + + if (Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.Escape)) + { + ReturnToMainMenu(); + } + } + + // ==================================================================== + // 激活 / 隐藏 + // ==================================================================== + + private void Activate() + { + _isVisible = true; + + if (lostCanvas != null) + lostCanvas.enabled = true; + + // 自动查找标题元素(兜底:Inspector 未赋值时从 Canvas 子节点中找) + AutoFindTitleElement(); + + Debug.Log($"[GameLostOverlay] Activate - lostTitleImage={lostTitleImage != null}, lostTitleText={lostTitleText != null}, canvas={lostCanvas != null}"); + + // 启动标题渐现动效(水面波纹 + 渐现) + if (_titleAnimCoroutine != null) + StopCoroutine(_titleAnimCoroutine); + _titleAnimCoroutine = StartCoroutine(TitleRippleFadeIn()); + + // 绑定按钮 + 延迟渐现 + if (mainMenuButton != null) + { + mainMenuButton.onClick.RemoveAllListeners(); + mainMenuButton.onClick.AddListener(ReturnToMainMenu); + + // 初始隐藏按钮 + SetButtonAlpha(0f); + + // 延迟后渐现 + if (_buttonFadeCoroutine != null) + StopCoroutine(_buttonFadeCoroutine); + _buttonFadeCoroutine = StartCoroutine(ButtonFadeIn()); + } + + // 音效 + if (AudioManager.Instance != null && lostSFX != null) + AudioManager.Instance.PlaySFX(lostSFX); + + // 显示鼠标 + Cursor.visible = true; + Cursor.lockState = CursorLockMode.None; + } + + /// + /// 按钮延迟渐现协程:等待 buttonFadeDelay 秒后,用 buttonFadeDuration 秒渐现。 + /// + private IEnumerator ButtonFadeIn() + { + yield return new WaitForSecondsRealtime(buttonFadeDelay); + + float elapsed = 0f; + while (elapsed < buttonFadeDuration) + { + elapsed += Time.unscaledDeltaTime; + float t = Mathf.Clamp01(elapsed / buttonFadeDuration); + SetButtonAlpha(t); + yield return null; + } + SetButtonAlpha(1f); + + if (mainMenuButton != null) + mainMenuButton.Select(); + } + + /// + /// 设置按钮整体透明度(通过 Image.color.a)。 + /// + private void SetButtonAlpha(float alpha) + { + if (mainMenuButtonImage != null) + { + var c = mainMenuButtonImage.color; + c.a = alpha; + mainMenuButtonImage.color = c; + } + // 同时处理按钮子物体的 Text + if (mainMenuButton != null) + { + var texts = mainMenuButton.GetComponentsInChildren(true); + foreach (var t in texts) + { + var c = t.color; + c.a = alpha; + t.color = c; + } + } + } + + /// + /// 返回主界面。 + /// + private void ReturnToMainMenu() + { + _isVisible = false; + + Time.timeScale = 1f; + Cursor.visible = true; + Cursor.lockState = CursorLockMode.None; + + if (SceneLoader.Instance != null) + SceneLoader.Instance.LoadMainMenuScene(); + else + SceneManager.LoadScene("MainMenu"); + } + + /// + /// 自动查找标题元素。搜索范围: + /// 1. 自身 transform 子节点 + /// 2. 场景中所有 Canvas 的子节点 + /// 3. 都找不到则动态创建 + /// + private void AutoFindTitleElement() + { + if (lostTitleImage != null || lostTitleText != null) return; + + // 1. 从自身子节点查找 + TryFindTitleInHierarchy(transform); + if (lostTitleText != null || lostTitleImage != null) return; + + // 2. 从 lostCanvas 子节点查找 + if (lostCanvas != null) + { + TryFindTitleInHierarchy(lostCanvas.transform); + if (lostTitleText != null || lostTitleImage != null) return; + } + + // 3. 从场景中所有 Canvas 查找 + var allCanvases = FindObjectsOfType(); + foreach (var c in allCanvases) + { + if (c == lostCanvas) continue; + TryFindTitleInHierarchy(c.transform); + if (lostTitleText != null || lostTitleImage != null) return; + } + + // 4. 都找不到 + Debug.LogWarning("[GameLostOverlay] 未找到标题元素,请在 Inspector 中拖入 lostTitleImage 或 lostTitleText。"); + } + + private void TryFindTitleInHierarchy(Transform root) + { + // 按路径查找 + var titleObj = root.Find("CenterPanel/LostTitle"); + if (titleObj != null) + { + lostTitleImage = titleObj.GetComponent(); + if (lostTitleImage != null) return; + lostTitleText = titleObj.GetComponent(); + if (lostTitleText != null) return; + } + + // 按名称查找 Image(lostTitleImage 节点) + var allImages = root.GetComponentsInChildren(true); + foreach (var img in allImages) + { + var name = img.gameObject.name.ToLower(); + if (name.Contains("lost") || name.Contains("title") || name.Contains("迷失")) + { + lostTitleImage = img; + return; + } + } + + // 按文字内容查找 Text + var allTexts = root.GetComponentsInChildren(true); + foreach (var t in allTexts) + { + if (t.text.Contains("迷失") || t.text.Contains("Lost")) + { + lostTitleText = t; + return; + } + } + + // 兜底:第一个非按钮 Text + foreach (var t in allTexts) + { + if (t.GetComponentInParent