diff --git a/Assets/AddressableAssetsData/link.xml b/Assets/AddressableAssetsData/link.xml deleted file mode 100644 index 62ce7303..00000000 --- a/Assets/AddressableAssetsData/link.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Assets/AddressableAssetsData/link.xml.meta b/Assets/AddressableAssetsData/link.xml.meta deleted file mode 100644 index 8ce5431f..00000000 --- a/Assets/AddressableAssetsData/link.xml.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 0bd49428350698946b692e1dd6c3eb5e -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scenes/gamePlay_gamePlay.unity b/Assets/Scenes/gamePlay_gamePlay.unity index 95319e50..ebbf2e64 100644 --- a/Assets/Scenes/gamePlay_gamePlay.unity +++ b/Assets/Scenes/gamePlay_gamePlay.unity @@ -10903,6 +10903,156 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 162, y: 100} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &227742951 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 227742952} + - component: {fileID: 227742955} + - component: {fileID: 227742954} + - component: {fileID: 227742953} + m_Layer: 0 + m_Name: _AndroidTapDetectLine + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &227742952 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 227742951} + 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: 820215023} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &227742953 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 227742951} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 51fe12fce9a3cec41bb85f2ed4d0e5e3, type: 3} + m_Name: + m_EditorClassIdentifier: + trackIndex: 3 + followTarget: {fileID: 0} + followRotation: 1 +--- !u!61 &227742954 +BoxCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 227742951} + m_Enabled: 1 + serializedVersion: 3 + m_Density: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ForceSendLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ForceReceiveLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ContactCaptureLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_CallbackLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_IsTrigger: 0 + m_UsedByEffector: 0 + m_CompositeOperation: 0 + m_CompositeOrder: 0 + m_Offset: {x: 0, y: 0} + m_SpriteTilingProperty: + border: {x: 0, y: 0, z: 0, w: 0} + pivot: {x: 0.5, y: 0.5} + oldSize: {x: 1.97, y: 10.8} + newSize: {x: 11.99, y: 10.8} + adaptiveTilingThreshold: 0.5 + drawMode: 0 + adaptiveTiling: 0 + m_AutoTiling: 0 + m_Size: {x: 1.97, y: 10.8} + m_EdgeRadius: 0 +--- !u!212 &227742955 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 227742951} + m_Enabled: 0 + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + 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: 4 + m_Sprite: {fileID: 21300000, guid: e816a07ba153c4647b5544d5edd6d3c6, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 0.3529412} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 11.99, y: 10.8} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 --- !u!1 &228531561 GameObject: m_ObjectHideFlags: 0 @@ -10938,6 +11088,7 @@ Transform: - {fileID: 766553121} - {fileID: 396376010} - {fileID: 2085829916} + - {fileID: 961712129} m_Father: {fileID: 1568415819} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!212 &228531563 @@ -17390,7 +17541,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: 560/560 + m_text: 1500/1500 m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 7cad3f54ac7b53d4885f00c16f1a6929, type: 2} m_sharedMaterial: {fileID: -346136068272202111, guid: 7cad3f54ac7b53d4885f00c16f1a6929, type: 2} @@ -20552,6 +20703,7 @@ Transform: - {fileID: 1814450260} - {fileID: 518846680} - {fileID: 831755762} + - {fileID: 1410371134} m_Father: {fileID: 1568415819} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!212 &471259275 @@ -24176,6 +24328,156 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 629381757} m_CullTransparentMesh: 1 +--- !u!1 &630992056 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 630992057} + - component: {fileID: 630992060} + - component: {fileID: 630992059} + - component: {fileID: 630992058} + m_Layer: 0 + m_Name: _AndroidTapDetectLine + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &630992057 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 630992056} + 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: 1801052429} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &630992058 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 630992056} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 51fe12fce9a3cec41bb85f2ed4d0e5e3, type: 3} + m_Name: + m_EditorClassIdentifier: + trackIndex: 1 + followTarget: {fileID: 0} + followRotation: 1 +--- !u!61 &630992059 +BoxCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 630992056} + m_Enabled: 1 + serializedVersion: 3 + m_Density: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ForceSendLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ForceReceiveLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ContactCaptureLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_CallbackLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_IsTrigger: 0 + m_UsedByEffector: 0 + m_CompositeOperation: 0 + m_CompositeOrder: 0 + m_Offset: {x: 0, y: 0} + m_SpriteTilingProperty: + border: {x: 0, y: 0, z: 0, w: 0} + pivot: {x: 0.5, y: 0.5} + oldSize: {x: 1.97, y: 10.8} + newSize: {x: 11.99, y: 10.8} + adaptiveTilingThreshold: 0.5 + drawMode: 0 + adaptiveTiling: 0 + m_AutoTiling: 0 + m_Size: {x: 1.97, y: 10.8} + m_EdgeRadius: 0 +--- !u!212 &630992060 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 630992056} + m_Enabled: 0 + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + 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: 4 + m_Sprite: {fileID: 21300000, guid: e816a07ba153c4647b5544d5edd6d3c6, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 0.3529412} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 11.99, y: 10.8} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 --- !u!1 &632747001 GameObject: m_ObjectHideFlags: 0 @@ -34270,7 +34572,7 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 802900243} - m_Enabled: 0 + m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: @@ -36651,6 +36953,7 @@ Transform: - {fileID: 856873761} - {fileID: 1848712590} - {fileID: 594748198} + - {fileID: 227742952} m_Father: {fileID: 1568415819} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!212 &820215024 @@ -37161,6 +37464,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 276712529} + - {fileID: 1460982759} - {fileID: 1113650922} m_Father: {fileID: 1551841547} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -40410,6 +40714,156 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 961429714} m_CullTransparentMesh: 1 +--- !u!1 &961712128 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 961712129} + - component: {fileID: 961712132} + - component: {fileID: 961712131} + - component: {fileID: 961712130} + m_Layer: 0 + m_Name: _AndroidTapDetectLine + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &961712129 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 961712128} + 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: 228531562} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &961712130 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 961712128} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 51fe12fce9a3cec41bb85f2ed4d0e5e3, type: 3} + m_Name: + m_EditorClassIdentifier: + trackIndex: 2 + followTarget: {fileID: 0} + followRotation: 1 +--- !u!61 &961712131 +BoxCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 961712128} + m_Enabled: 1 + serializedVersion: 3 + m_Density: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ForceSendLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ForceReceiveLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ContactCaptureLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_CallbackLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_IsTrigger: 0 + m_UsedByEffector: 0 + m_CompositeOperation: 0 + m_CompositeOrder: 0 + m_Offset: {x: 0, y: 0} + m_SpriteTilingProperty: + border: {x: 0, y: 0, z: 0, w: 0} + pivot: {x: 0.5, y: 0.5} + oldSize: {x: 1.97, y: 10.8} + newSize: {x: 11.99, y: 10.8} + adaptiveTilingThreshold: 0.5 + drawMode: 0 + adaptiveTiling: 0 + m_AutoTiling: 0 + m_Size: {x: 1.97, y: 10.8} + m_EdgeRadius: 0 +--- !u!212 &961712132 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 961712128} + m_Enabled: 0 + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + 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: 4 + m_Sprite: {fileID: 21300000, guid: e816a07ba153c4647b5544d5edd6d3c6, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 0.3529412} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 11.99, y: 10.8} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 --- !u!4 &962195945 stripped Transform: m_CorrespondingSourceObject: {fileID: 4907775837964014163, guid: 96d352d647a28914c97c8e0732daf67e, type: 3} @@ -43861,6 +44315,7 @@ Transform: - {fileID: 480679343} - {fileID: 424100674} - {fileID: 2055240851} + - {fileID: 1965895505} m_Father: {fileID: 1568415819} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!212 &1083269824 @@ -44172,7 +44627,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 320.5, y: -50} - m_SizeDelta: {x: 321, y: 116} + m_SizeDelta: {x: 0, y: 116} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1090215143 MonoBehaviour: @@ -46763,7 +47218,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: 1900/1900 + m_text: 620/620 m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 7cad3f54ac7b53d4885f00c16f1a6929, type: 2} m_sharedMaterial: {fileID: -346136068272202111, guid: 7cad3f54ac7b53d4885f00c16f1a6929, type: 2} @@ -49722,7 +50177,7 @@ MonoBehaviour: gameplaySceneName: gamePlay_gamePlay requirePlaybackStarted: 1 pauseButtonScenePath: artworks/NEW UI/zhuangshi (3)/Pause - pauseTriggerButton: {fileID: 802900245} + pauseTriggerButton: {fileID: 1460982760} continueButton: {fileID: 2447209698389928936} replayButton: {fileID: 5583248084823892525} exitButton: {fileID: 1290499235465011860} @@ -54563,6 +55018,156 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1410197819} m_CullTransparentMesh: 1 +--- !u!1 &1410371133 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1410371134} + - component: {fileID: 1410371137} + - component: {fileID: 1410371136} + - component: {fileID: 1410371135} + m_Layer: 0 + m_Name: _AndroidTapDetectLine + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1410371134 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1410371133} + 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: 471259274} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1410371135 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1410371133} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 51fe12fce9a3cec41bb85f2ed4d0e5e3, type: 3} + m_Name: + m_EditorClassIdentifier: + trackIndex: 4 + followTarget: {fileID: 0} + followRotation: 1 +--- !u!61 &1410371136 +BoxCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1410371133} + m_Enabled: 1 + serializedVersion: 3 + m_Density: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ForceSendLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ForceReceiveLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ContactCaptureLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_CallbackLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_IsTrigger: 0 + m_UsedByEffector: 0 + m_CompositeOperation: 0 + m_CompositeOrder: 0 + m_Offset: {x: 0, y: 0} + m_SpriteTilingProperty: + border: {x: 0, y: 0, z: 0, w: 0} + pivot: {x: 0.5, y: 0.5} + oldSize: {x: 1.97, y: 10.8} + newSize: {x: 11.99, y: 10.8} + adaptiveTilingThreshold: 0.5 + drawMode: 0 + adaptiveTiling: 0 + m_AutoTiling: 0 + m_Size: {x: 1.97, y: 10.8} + m_EdgeRadius: 0 +--- !u!212 &1410371137 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1410371133} + m_Enabled: 0 + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + 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: 4 + m_Sprite: {fileID: 21300000, guid: e816a07ba153c4647b5544d5edd6d3c6, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 0.3529412} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 11.99, y: 10.8} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 --- !u!1 &1411875367 GameObject: m_ObjectHideFlags: 0 @@ -55386,6 +55991,126 @@ RectTransform: m_AnchoredPosition: {x: 971.3794, y: 396.2654} m_SizeDelta: {x: 100, y: 100} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1460982758 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1460982759} + - component: {fileID: 1460982762} + - component: {fileID: 1460982761} + - component: {fileID: 1460982760} + m_Layer: 0 + m_Name: pauseButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1460982759 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1460982758} + 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: 839350760} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1873.44, y: -50} + m_SizeDelta: {x: 45, y: 45} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1460982760 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1460982758} + 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: 1460982761} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1460982761 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1460982758} + 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: 21300000, guid: cbae90032201fb947b79beddd8171042, type: 3} + 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 &1460982762 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1460982758} + m_CullTransparentMesh: 1 --- !u!1 &1461351368 GameObject: m_ObjectHideFlags: 0 @@ -56622,14 +57347,14 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: slotIndex: 2 - maxHP: 1900 - currentHP: 1900 + maxHP: 620 + currentHP: 620 maxMana: 200 currentMana: 0 damageResistance: 0 - scoreEfficiency: 0.12 + scoreEfficiency: 0.04 bmm: {fileID: 1261342020} - attack: 37 + attack: 7 baseTrackScore: 1000 perfectRatio: 1 greatRatio: 0.75 @@ -58948,6 +59673,7 @@ GameObject: m_Component: - component: {fileID: 1577793742} - component: {fileID: 1577793741} + - component: {fileID: 1577793743} m_Layer: 0 m_Name: JudgeManager m_TagString: Untagged @@ -58989,6 +59715,25 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1577793743 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1577793740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 16d03d0d613217b4ebdba1b8b63bf735, type: 3} + m_Name: + m_EditorClassIdentifier: + gameplayCamera: {fileID: 754533170} + enableMouseFallback: 1 + hitLayers: + serializedVersion: 2 + m_Bits: 4294967295 + trackPlaneWorldZ: 0 + forceOrthographicMode: 0 --- !u!1 &1579840623 GameObject: m_ObjectHideFlags: 0 @@ -64336,6 +65081,7 @@ Transform: - {fileID: 614786766} - {fileID: 1466703738} - {fileID: 1646580879} + - {fileID: 630992057} m_Father: {fileID: 1568415819} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!212 &1801052430 @@ -66575,14 +67321,14 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: slotIndex: 4 - maxHP: 560 - currentHP: 560 - maxMana: 100 + maxHP: 1500 + currentHP: 1500 + maxMana: 300 currentMana: 0 damageResistance: 0 - scoreEfficiency: 0.01 + scoreEfficiency: 0.09 bmm: {fileID: 1261342020} - attack: 8 + attack: 38 baseTrackScore: 1000 perfectRatio: 1 greatRatio: 0.75 @@ -69036,6 +69782,156 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1965895504 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1965895505} + - component: {fileID: 1965895508} + - component: {fileID: 1965895507} + - component: {fileID: 1965895506} + m_Layer: 0 + m_Name: _AndroidTapDetectLine + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1965895505 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1965895504} + 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: 1083269823} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1965895506 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1965895504} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 51fe12fce9a3cec41bb85f2ed4d0e5e3, type: 3} + m_Name: + m_EditorClassIdentifier: + trackIndex: 0 + followTarget: {fileID: 0} + followRotation: 1 +--- !u!61 &1965895507 +BoxCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1965895504} + m_Enabled: 1 + serializedVersion: 3 + m_Density: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ForceSendLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ForceReceiveLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ContactCaptureLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_CallbackLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_IsTrigger: 0 + m_UsedByEffector: 0 + m_CompositeOperation: 0 + m_CompositeOrder: 0 + m_Offset: {x: 0, y: 0} + m_SpriteTilingProperty: + border: {x: 0, y: 0, z: 0, w: 0} + pivot: {x: 0.5, y: 0.5} + oldSize: {x: 1.97, y: 10.8} + newSize: {x: 11.99, y: 10.8} + adaptiveTilingThreshold: 0.5 + drawMode: 0 + adaptiveTiling: 0 + m_AutoTiling: 0 + m_Size: {x: 1.97, y: 10.8} + m_EdgeRadius: 0 +--- !u!212 &1965895508 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1965895504} + m_Enabled: 0 + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + 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: 4 + m_Sprite: {fileID: 21300000, guid: e816a07ba153c4647b5544d5edd6d3c6, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 0.3529412} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 11.99, y: 10.8} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 --- !u!224 &1970322402 stripped RectTransform: m_CorrespondingSourceObject: {fileID: 4530472541819974216, guid: 542ea48079cbe3b4cb76c62c842e1175, type: 3} diff --git a/Assets/idolsDisplay/UI_Idols.cs b/Assets/idolsDisplay/UI_Idols.cs index 499e6dd6..ac0ec785 100644 --- a/Assets/idolsDisplay/UI_Idols.cs +++ b/Assets/idolsDisplay/UI_Idols.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using DG.Tweening; using UnityEngine; @@ -86,12 +87,14 @@ public class UI_Idols : MonoBehaviour private bool suppressToggleCallbacks; private int pendingGrowthAnimationHeroId = -1; private Tween idolExpBarTween; + private Coroutine startupSkillValidationRoutine; private void Start() { BindQuitButton(); InitializeSectionToggles(); RebuildCards(); + BeginStartupSkillValidation(); } private void OnEnable() @@ -123,6 +126,11 @@ public class UI_Idols : MonoBehaviour idolExpBarTween.Kill(); idolExpBarTween = null; } + if (startupSkillValidationRoutine != null) + { + StopCoroutine(startupSkillValidationRoutine); + startupSkillValidationRoutine = null; + } UnbindSectionToggles(); } @@ -152,6 +160,37 @@ public class UI_Idols : MonoBehaviour gameObject.SetActive(false); } + private void BeginStartupSkillValidation() + { + if (!isActiveAndEnabled) + { + return; + } + + if (startupSkillValidationRoutine != null) + { + StopCoroutine(startupSkillValidationRoutine); + } + + startupSkillValidationRoutine = StartCoroutine(ValidateSkillsOnStartupRoutine()); + } + + private IEnumerator ValidateSkillsOnStartupRoutine() + { + yield return null; + + bool anyChanged = false; + yield return AllyHeroSkillSelectionValidator.ValidateAllHeroesAsync(2, changed => anyChanged = changed); + startupSkillValidationRoutine = null; + + if (!anyChanged) + { + yield break; + } + + RebuildCards(false); + } + private void InitializeSectionToggles() { BindSectionToggles(); diff --git a/Assets/scripts/Data/AllyHeroSkillSelectionValidator.cs b/Assets/scripts/Data/AllyHeroSkillSelectionValidator.cs new file mode 100644 index 00000000..b87b1f6f --- /dev/null +++ b/Assets/scripts/Data/AllyHeroSkillSelectionValidator.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections; +using UnityEngine; + +public static class AllyHeroSkillSelectionValidator +{ + public static IEnumerator ValidateAllHeroesAsync(int heroesPerFrame = 2, Action onCompleted = null) + { + AllyHero_SO[] heroes = RuntimeResourcesCache.LoadAllAllyHeroes(); + bool anyChanged = false; + int processedThisFrame = 0; + int batchSize = Mathf.Max(1, heroesPerFrame); + + for (int i = 0; i < heroes.Length; i++) + { + AllyHero_SO hero = heroes[i]; + if (hero != null && hero.ValidateEquippedSkillSelections()) + { + anyChanged = true; + } + + processedThisFrame++; + if (processedThisFrame >= batchSize) + { + processedThisFrame = 0; + yield return null; + } + } + + onCompleted?.Invoke(anyChanged); + } +} diff --git a/Assets/scripts/Data/AllyHeroSkillSelectionValidator.cs.meta b/Assets/scripts/Data/AllyHeroSkillSelectionValidator.cs.meta new file mode 100644 index 00000000..bc3462f8 --- /dev/null +++ b/Assets/scripts/Data/AllyHeroSkillSelectionValidator.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: aebb9d085d6f9c14fa7ff27d1b4e6e03 \ No newline at end of file diff --git a/Assets/scripts/Data/AllyHero_SO.cs b/Assets/scripts/Data/AllyHero_SO.cs index 6e0e1547..60c42294 100644 --- a/Assets/scripts/Data/AllyHero_SO.cs +++ b/Assets/scripts/Data/AllyHero_SO.cs @@ -189,6 +189,77 @@ public class AllyHero_SO : ScriptableObject return EquipmentSkillGroupLibrary.ResolveSkillGroup(groupID); } + public bool ValidateEquippedSkillSelections(bool persistIfChanged = true) + { + LoadEquippedSkillsFromLocal(); + LoadEquippedEquipmentFromLocal(); + + if (equippedSkillGroupIDs == null) + { + equippedSkillGroupIDs = Array.Empty(); + } + + int currentLevelId = GetEffectiveLevelForCurrentEXP()?.levelID ?? 0; + int maxSkillSlots = Mathf.Max(0, GetEffectiveSkillSlotLimit()); + List validatedGroupIds = new List(Mathf.Min(equippedSkillGroupIDs.Length, maxSkillSlots)); + HashSet seenGroupIds = new HashSet(); + + for (int i = 0; i < equippedSkillGroupIDs.Length; i++) + { + int groupId = equippedSkillGroupIDs[i]; + if (groupId <= 0 || !seenGroupIds.Add(groupId)) + { + continue; + } + + if (validatedGroupIds.Count >= maxSkillSlots) + { + continue; + } + + SkillGroup group = GetOwnedSkillGroupByID(groupId); + if (group == null) + { + continue; + } + + int requiredLevelId = Mathf.Clamp(group.thisSkill_levelLimit, 1, 4); + if (currentLevelId < requiredLevelId) + { + continue; + } + + validatedGroupIds.Add(groupId); + } + + int[] validatedArray = validatedGroupIds.ToArray(); + bool changed = !AreSkillGroupIdArraysEqual(equippedSkillGroupIDs, validatedArray); + if (!changed) + { + return false; + } + + equippedSkillGroupIDs = validatedArray; + + if (persistIfChanged) + { + SaveEquippedSkillsToLocal(); + } + +#if UNITY_EDITOR + if (!Application.isPlaying) + { + EditorUtility.SetDirty(this); + if (persistIfChanged) + { + AssetDatabase.SaveAssets(); + } + } +#endif + + return true; + } + public int[] GetEffectiveEquippedSkillGroupIDs() { var result = new List(); @@ -365,6 +436,45 @@ public class AllyHero_SO : ScriptableObject result.Add(groupId); } + private static bool AreSkillGroupIdArraysEqual(int[] left, int[] right) + { + int leftLength = left != null ? left.Length : 0; + int rightLength = right != null ? right.Length : 0; + if (leftLength != rightLength) + { + return false; + } + + for (int i = 0; i < leftLength; i++) + { + if (left[i] != right[i]) + { + return false; + } + } + + return true; + } + + private SkillGroup GetOwnedSkillGroupByID(int groupId) + { + if (skillGroups == null || skillGroups.Length == 0) + { + return null; + } + + for (int i = 0; i < skillGroups.Length; i++) + { + SkillGroup group = skillGroups[i]; + if (group != null && group.skillGroupID == groupId) + { + return group; + } + } + + return null; + } + public int GetUnlockedLevelIndex() { List sorted = BuildSortedLevelStats(); diff --git a/Assets/scripts/Team/newTeamSelector.cs b/Assets/scripts/Team/newTeamSelector.cs index 304e9dcb..e1b51481 100644 --- a/Assets/scripts/Team/newTeamSelector.cs +++ b/Assets/scripts/Team/newTeamSelector.cs @@ -47,6 +47,7 @@ public class newTeamSelector : MonoBehaviour private static AllyHero_SO[] cachedHeroes; private static Dictionary cachedHeroesById; private Coroutine refreshSkillsRoutine; + private Coroutine startupSkillValidationRoutine; void Awake() { @@ -65,14 +66,24 @@ public class newTeamSelector : MonoBehaviour { RefreshTeamShareCodeDisplay(); if (instantiateOnStart) + { CreateSlots(); - StartCoroutine(LoadSelectedHeroesNextFrame()); + } + + if (startupSkillValidationRoutine != null) + { + StopCoroutine(startupSkillValidationRoutine); + } + + startupSkillValidationRoutine = StartCoroutine(StartupLoadRoutine()); } - private IEnumerator LoadSelectedHeroesNextFrame() + private IEnumerator StartupLoadRoutine() { yield return null; + yield return AllyHeroSkillSelectionValidator.ValidateAllHeroesAsync(); LoadSelectedHeroes(); + startupSkillValidationRoutine = null; } public void CreateSlots() diff --git a/Assets/scripts/UI/PauseManager.cs b/Assets/scripts/UI/PauseManager.cs index 87eb893f..a869b7ab 100644 --- a/Assets/scripts/UI/PauseManager.cs +++ b/Assets/scripts/UI/PauseManager.cs @@ -33,6 +33,8 @@ public class PauseManager : MonoBehaviour [Header("Buttons")] [SerializeField] private string pauseButtonScenePath = "artworks/NEW UI/zhuangshi (3)/Pause"; + [Tooltip("手游暂停按钮:把场景里的暂停 Button 拖到这里,点击效果等同 ESC。\n" + + "留空则按 pauseButtonScenePath 或名为 \"Pause\" 的按钮自动查找。")] [SerializeField] private Button pauseTriggerButton; [SerializeField] private Button continueButton; [SerializeField] private Button replayButton; diff --git a/Assets/scripts/gamePlay_gameplay/TrackTouchInput.cs b/Assets/scripts/gamePlay_gameplay/TrackTouchInput.cs new file mode 100644 index 00000000..c2e4e847 --- /dev/null +++ b/Assets/scripts/gamePlay_gameplay/TrackTouchInput.cs @@ -0,0 +1,182 @@ +using System.Collections.Generic; +using UnityEngine; + +/// +/// 手游触屏输入分发器:每帧遍历所有触摸点(及编辑器鼠标),用 Physics2D.OverlapPoint +/// 命中带 TrackTouchZone 的透明 Collider2D,把按下/抬起转发给 InputManager。 +/// +/// 为什么用这种方式而不是 UI 的 IPointerDownHandler: +/// - 轨道会平移+旋转晃动,点击区必须跟随晃动的 Collider(OverlapPoint 支持旋转过的碰撞体)。 +/// - 需要多点触控:每根手指独立按住各自的轨道(靠 fingerId 配对按下/抬起)。 +/// +/// 判定逻辑完全不变:这里只调用现成的 PressTrack/ReleaseTrack, +/// 判定时间戳仍由 Note.HandlePress 读取 GameplayClock.NowSongTime(dspTime)。 +/// +/// 用法:场景里放一个空物体挂本脚本,把主相机拖到 gameplayCamera(留空则自动取 Camera.main)。 +/// 5 块透明轨道点击区各挂 TrackTouchZone 并设置 trackIndex。 +/// +public class TrackTouchInput : MonoBehaviour +{ + [Tooltip("渲染 gameplay 的相机。留空则自动使用 Camera.main。")] + [SerializeField] private Camera gameplayCamera; + + [Tooltip("是否在编辑器/PC 上用鼠标模拟单点触摸(方便调试)。")] + [SerializeField] private bool enableMouseFallback = true; + + [Tooltip("命中检测使用的层。默认 Everything;如需只检测点击区层可在此限制。")] + [SerializeField] private LayerMask hitLayers = ~0; + + [Tooltip("透视相机必填:轨道点击区所在平面的世界 Z 坐标(轨道 Collider 的 Z)。\n" + + "透视相机下屏幕点转世界点依赖深度,用它把射线交到轨道平面,相机怎么晃/推拉都精确。\n" + + "正交相机可忽略此项。")] + [SerializeField] private float trackPlaneWorldZ = 0f; + + [Tooltip("相机是否为正交投影。正交相机忽略深度,命中转换更简单。\n" + + "留空自动按相机 orthographic 判断;一般不用手动改。")] + [SerializeField] private bool forceOrthographicMode = false; + + // fingerId -> 当前按住的轨道索引。用于在抬起/取消时精确释放对应轨道。 + private readonly Dictionary _activeTouches = new Dictionary(); + // 鼠标模拟用的"手指 id",取一个不会和真实 fingerId 冲突的值。 + private const int MouseFingerId = -100; + private int _mouseHeldTrack = -1; + + private Camera Cam + { + get + { + if (gameplayCamera == null) gameplayCamera = Camera.main; + return gameplayCamera; + } + } + + private void Update() + { + var im = InputManager.Instance; + if (im == null) return; + + Camera cam = Cam; + if (cam == null) return; + + ProcessTouches(im, cam); + + if (enableMouseFallback && Input.touchCount == 0) + { + ProcessMouse(im, cam); + } + } + + private void ProcessTouches(InputManager im, Camera cam) + { + for (int i = 0; i < Input.touchCount; i++) + { + Touch t = Input.GetTouch(i); + + switch (t.phase) + { + case TouchPhase.Began: + { + int track = ResolveTrack(cam, t.position); + if (track >= 0) + { + _activeTouches[t.fingerId] = track; + im.PressTrack(track); + } + break; + } + case TouchPhase.Ended: + case TouchPhase.Canceled: + { + if (_activeTouches.TryGetValue(t.fingerId, out int track)) + { + _activeTouches.Remove(t.fingerId); + im.ReleaseTrack(track); + } + break; + } + // Moved / Stationary:手指在轨道内保持按住即可,不重新判定归属, + // 避免手指轻微滑动跨到相邻轨道时反复 Press/Release 造成误判。 + } + } + } + + private void ProcessMouse(InputManager im, Camera cam) + { + if (Input.GetMouseButtonDown(0)) + { + int track = ResolveTrack(cam, Input.mousePosition); + if (track >= 0) + { + _mouseHeldTrack = track; + im.PressTrack(track); + } + } + else if (Input.GetMouseButtonUp(0)) + { + if (_mouseHeldTrack >= 0) + { + im.ReleaseTrack(_mouseHeldTrack); + _mouseHeldTrack = -1; + } + } + } + + /// + /// 把屏幕坐标转换为轨道平面上的世界点,用 OverlapPoint 命中轨道点击区,返回轨道索引;无命中返回 -1。 + /// + /// 相机移动/晃动/推拉时,每帧都用当前相机状态转换,所以命中自动跟随相机。 + /// - 正交相机:ScreenToWorldPoint 忽略深度,直接取 x/y。 + /// - 透视相机:从相机发射线,求与轨道平面(Z = trackPlaneWorldZ)的交点, + /// 避免因相机 Z 变化(如 cameraDash)导致命中点偏移。 + /// + private int ResolveTrack(Camera cam, Vector2 screenPos) + { + Vector2 point; + + if (forceOrthographicMode || cam.orthographic) + { + Vector3 world = cam.ScreenToWorldPoint(screenPos); + point = new Vector2(world.x, world.y); + } + else + { + // 透视:射线与轨道平面(法线 +Z,过 z = trackPlaneWorldZ)求交。 + Ray ray = cam.ScreenPointToRay(screenPos); + float denom = ray.direction.z; + if (Mathf.Abs(denom) < 1e-6f) + { + return -1; // 射线与平面近乎平行,无有效交点 + } + float t = (trackPlaneWorldZ - ray.origin.z) / denom; + if (t < 0f) + { + return -1; // 交点在相机背后 + } + Vector3 world = ray.origin + ray.direction * t; + point = new Vector2(world.x, world.y); + } + + Collider2D hit = Physics2D.OverlapPoint(point, hitLayers); + if (hit == null) return -1; + + TrackTouchZone zone = hit.GetComponent(); + if (zone == null) zone = hit.GetComponentInParent(); + return zone != null ? zone.trackIndex : -1; + } + + private void OnDisable() + { + // 组件被关闭/切场景时,释放所有还按住的轨道,避免音符卡在 held 状态。 + var im = InputManager.Instance; + if (im != null) + { + foreach (var kv in _activeTouches) + { + im.ReleaseTrack(kv.Value); + } + if (_mouseHeldTrack >= 0) im.ReleaseTrack(_mouseHeldTrack); + } + _activeTouches.Clear(); + _mouseHeldTrack = -1; + } +} diff --git a/Assets/scripts/gamePlay_gameplay/TrackTouchInput.cs.meta b/Assets/scripts/gamePlay_gameplay/TrackTouchInput.cs.meta new file mode 100644 index 00000000..290c0cf0 --- /dev/null +++ b/Assets/scripts/gamePlay_gameplay/TrackTouchInput.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 16d03d0d613217b4ebdba1b8b63bf735 \ No newline at end of file diff --git a/Assets/scripts/gamePlay_gameplay/TrackTouchRegionLayoutController.cs b/Assets/scripts/gamePlay_gameplay/TrackTouchRegionLayoutController.cs new file mode 100644 index 00000000..ffcebbe4 --- /dev/null +++ b/Assets/scripts/gamePlay_gameplay/TrackTouchRegionLayoutController.cs @@ -0,0 +1,118 @@ +using System; +using UnityEngine; +using UnityEngine.UI; + +/// +/// Binds five pre-authored UI touch regions to the existing gameplay input path. +/// This script does not create runtime objects. You assign the region RectTransforms +/// in the inspector, and it ensures each one has an Image raycast target plus a +/// TrackTouchRegion configured with the matching track index. +/// +[DisallowMultipleComponent] +public class TrackTouchRegionLayoutController : MonoBehaviour +{ + [Serializable] + public class RegionBinding + { + [Range(0, 4)] + public int trackIndex; + + [Tooltip("Pre-authored UI region to bind. Assign in inspector.")] + public RectTransform regionObject; + + [Tooltip("Optional debug tint. Alpha 0 keeps the region invisible while preserving raycasts.")] + public Color debugTint = new Color(1f, 1f, 1f, 0f); + } + + [Header("Behavior")] + public bool bindOnStart = true; + public bool mobileOnly = true; + + [Header("Prebound Regions")] + public RegionBinding[] regions = new RegionBinding[5]; + + private void Reset() + { + EnsureDefaultBindings(); + } + + private void Awake() + { + EnsureDefaultBindings(); + } + + private void Start() + { + if (!bindOnStart) + { + return; + } + + if (mobileOnly && !Application.isMobilePlatform) + { + return; + } + + ApplyBindings(); + } + + [ContextMenu("Apply Touch Region Bindings")] + public void ApplyBindings() + { + EnsureDefaultBindings(); + + for (int i = 0; i < regions.Length; i++) + { + BindRegion(regions[i], i); + } + } + + private void EnsureDefaultBindings() + { + if (regions == null || regions.Length != 5) + { + regions = new RegionBinding[5]; + } + + for (int i = 0; i < regions.Length; i++) + { + if (regions[i] == null) + { + regions[i] = new RegionBinding(); + } + + regions[i].trackIndex = Mathf.Clamp(i, 0, 4); + } + } + + private static void BindRegion(RegionBinding binding, int fallbackTrackIndex) + { + if (binding == null || binding.regionObject == null) + { + return; + } + + int trackIndex = Mathf.Clamp(binding.trackIndex, 0, 4); + if (trackIndex != fallbackTrackIndex) + { + trackIndex = Mathf.Clamp(trackIndex, 0, 4); + } + + Image image = binding.regionObject.GetComponent(); + if (image == null) + { + image = binding.regionObject.gameObject.AddComponent(); + } + + image.color = binding.debugTint; + image.raycastTarget = true; + + TrackTouchRegion touchRegion = binding.regionObject.GetComponent(); + if (touchRegion == null) + { + touchRegion = binding.regionObject.gameObject.AddComponent(); + } + + touchRegion.trackIndex = trackIndex; + } +} diff --git a/Assets/scripts/gamePlay_gameplay/TrackTouchRegionLayoutController.cs.meta b/Assets/scripts/gamePlay_gameplay/TrackTouchRegionLayoutController.cs.meta new file mode 100644 index 00000000..c21a2d0b --- /dev/null +++ b/Assets/scripts/gamePlay_gameplay/TrackTouchRegionLayoutController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4d4eeea52b79c624bbd827fba1ce5029 \ No newline at end of file diff --git a/Assets/scripts/gamePlay_gameplay/TrackTouchZone.cs b/Assets/scripts/gamePlay_gameplay/TrackTouchZone.cs new file mode 100644 index 00000000..75f0dfd1 --- /dev/null +++ b/Assets/scripts/gamePlay_gameplay/TrackTouchZone.cs @@ -0,0 +1,60 @@ +using UnityEngine; + +/// +/// 挂在一块"透明可点击区域"物体上,标记它对应哪条轨道(0-4)。 +/// 该物体需带一个 Collider2D(推荐 BoxCollider2D,可旋转)。 +/// +/// 两种跟随晃动的方式: +/// A) 直接把本物体作为会晃动的轨道 GameObject 的子物体 —— Unity 自动跟随平移+旋转, +/// 不需要 followTarget,留空即可。 +/// B) 无法作为子物体时,把会晃动的轨道 Transform 拖到 followTarget, +/// 本脚本会在 LateUpdate 中把自身对齐到它(位置+旋转),保证点击区跟着晃。 +/// +/// 判定完全不经过这里:命中检测由 TrackTouchInput 遍历触摸完成, +/// 只调用 InputManager.PressTrack/ReleaseTrack,判定时机仍走 dspTime。 +/// +[RequireComponent(typeof(Collider2D))] +public class TrackTouchZone : MonoBehaviour +{ + [Tooltip("本区域控制的轨道:0=红 1=绿 2=黄 3=紫 4=蓝")] + [Range(0, 4)] + public int trackIndex = 0; + + [Tooltip("可选。若本物体不是轨道的子物体,把会晃动的轨道 Transform 拖到这里,区域会每帧对齐到它(位置+旋转)。")] + public Transform followTarget; + + [Tooltip("followTarget 生效时,是否同步旋转(轨道会旋转时勾上)。")] + public bool followRotation = true; + + private Collider2D _collider; + + public Collider2D Collider + { + get + { + if (_collider == null) _collider = GetComponent(); + return _collider; + } + } + + private void Awake() + { + _collider = GetComponent(); + } + + private void LateUpdate() + { + // 在所有晃动逻辑(Update)之后对齐,避免落后一帧。 + if (followTarget == null) return; + + transform.position = new Vector3( + followTarget.position.x, + followTarget.position.y, + transform.position.z); + + if (followRotation) + { + transform.rotation = followTarget.rotation; + } + } +} diff --git a/Assets/scripts/gamePlay_gameplay/TrackTouchZone.cs.meta b/Assets/scripts/gamePlay_gameplay/TrackTouchZone.cs.meta new file mode 100644 index 00000000..eb8fc6fe --- /dev/null +++ b/Assets/scripts/gamePlay_gameplay/TrackTouchZone.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 51fe12fce9a3cec41bb85f2ed4d0e5e3 \ No newline at end of file diff --git a/Assets/scripts/settings/StartupSettingsApplier.cs b/Assets/scripts/settings/StartupSettingsApplier.cs index d8f7e578..dd90ab89 100644 --- a/Assets/scripts/settings/StartupSettingsApplier.cs +++ b/Assets/scripts/settings/StartupSettingsApplier.cs @@ -35,10 +35,22 @@ public sealed class StartupSettingsApplier : MonoBehaviour private void ApplyStartupSettings() { + ApplyAndroidLandscapeOrientation(); graphicSettings.ApplySavedDisplaySettingsAtStartup(this); ApplySavedAudioSettings(); } + private void ApplyAndroidLandscapeOrientation() + { +#if UNITY_ANDROID && !UNITY_EDITOR + Screen.autorotateToPortrait = false; + Screen.autorotateToPortraitUpsideDown = false; + Screen.autorotateToLandscapeLeft = true; + Screen.autorotateToLandscapeRight = true; + Screen.orientation = ScreenOrientation.AutoRotation; +#endif + } + private void ApplySavedAudioSettings() { audioSettingsPreloader[] preloaders = FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None); diff --git a/ProjectSettings/PackageManagerSettings.asset b/ProjectSettings/PackageManagerSettings.asset index 071530ab..5a2a9635 100644 --- a/ProjectSettings/PackageManagerSettings.asset +++ b/ProjectSettings/PackageManagerSettings.asset @@ -18,7 +18,7 @@ MonoBehaviour: m_SeeAllPackageVersions: 0 m_DismissPreviewPackagesInUse: 0 oneTimeWarningShown: 0 - oneTimeDeprecatedPopUpShown: 0 + oneTimeDeprecatedPopUpShown: 1 m_Registries: - m_Id: main m_Name: @@ -32,6 +32,6 @@ MonoBehaviour: m_RegistryInfoDraft: m_Modified: 0 m_ErrorMessage: - m_UserModificationsInstanceId: -890 - m_OriginalInstanceId: -892 + m_UserModificationsInstanceId: -874 + m_OriginalInstanceId: -876 m_LoadAssets: 0