From 6ca3e4a60fc61a156c246f8d778e286c5ad67ba4 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Mon, 1 Dec 2025 20:44:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=B8=E9=99=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../字魂像素积木体(商用需授权) SDF.asset | 4 +- Assets/Scenes/网格测试.unity | 703 +++++++++++------- .../EventSystemKit/EventTriggerEx.cs | 6 + .../BlockPuzzle/Class/BlockPuzzleGrid.cs | 22 +- .../BlockPuzzle/Class/BlockPuzzleGridEx.cs | 26 +- .../BlockPuzzle/Class/BlockShapeDragger.cs | 2 +- .../BlockPuzzle/Class/PlacementValidator.cs | 2 + .../BlockPuzzle/Class/ShapeDragger.cs | 180 +++++ .../BlockPuzzle/Class/ShapeDragger.cs.meta | 11 + .../BlockPuzzle/Interface/IBlockPuzzleGrid.cs | 5 +- .../Interface/IBlockShapeDragger.cs | 4 +- 11 files changed, 664 insertions(+), 301 deletions(-) create mode 100644 Assets/Scripts/MiniGame/BlockPuzzle/Class/ShapeDragger.cs create mode 100644 Assets/Scripts/MiniGame/BlockPuzzle/Class/ShapeDragger.cs.meta diff --git a/Assets/Font/Assets/字魂像素积木体(商用需授权) SDF.asset b/Assets/Font/Assets/字魂像素积木体(商用需授权) SDF.asset index 46b566e24..0a5dea853 100644 --- a/Assets/Font/Assets/字魂像素积木体(商用需授权) SDF.asset +++ b/Assets/Font/Assets/字魂像素积木体(商用需授权) SDF.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a560662cd717e21848ea6c188eddc71bf0d673c100bd17d2d49910e85a99bc5b -size 2131741 +oid sha256:d720c6d148a8cb33dae5dc84485a654be7bb230fb665a24242aea37a7425e4dc +size 2132271 diff --git a/Assets/Scenes/网格测试.unity b/Assets/Scenes/网格测试.unity index cee6a404e..3c7b1e6d2 100644 --- a/Assets/Scenes/网格测试.unity +++ b/Assets/Scenes/网格测试.unity @@ -123,7 +123,7 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} ---- !u!1 &199240525 +--- !u!1 &281764985 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -131,38 +131,38 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 199240526} - - component: {fileID: 199240527} + - component: {fileID: 281764986} + - component: {fileID: 281764987} m_Layer: 0 - m_Name: Cell_0_2 + m_Name: Cell_1_2 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &199240526 +--- !u!4 &281764986 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 199240525} + m_GameObject: {fileID: 281764985} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 2, z: 0} + m_LocalPosition: {x: 1, y: 2, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1147676901} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!212 &199240527 +--- !u!212 &281764987 SpriteRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 199240525} - m_Enabled: 1 + m_GameObject: {fileID: 281764985} + m_Enabled: 0 m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 1 @@ -196,7 +196,7 @@ SpriteRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 - m_Sprite: {fileID: 431031536} + m_Sprite: {fileID: 587689673} m_Color: {r: 1, g: 1, b: 1, a: 1} m_FlipX: 0 m_FlipY: 0 @@ -207,7 +207,7 @@ SpriteRenderer: m_WasSpriteAssigned: 1 m_MaskInteraction: 0 m_SpriteSortPoint: 0 ---- !u!1 &224755568 +--- !u!1 &301990981 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -215,92 +215,8 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 224755569} - - component: {fileID: 224755570} - m_Layer: 0 - m_Name: Cell_1_1 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &224755569 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 224755568} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 1, y: 1, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1147676901} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!212 &224755570 -SpriteRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 224755568} - 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_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: 0 - m_Sprite: {fileID: 431031536} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_FlipX: 0 - m_FlipY: 0 - m_DrawMode: 0 - m_Size: {x: 1, y: 1} - m_AdaptiveModeThreshold: 0.5 - m_SpriteTileMode: 0 - m_WasSpriteAssigned: 1 - m_MaskInteraction: 0 - m_SpriteSortPoint: 0 ---- !u!1 &397665472 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 397665473} - - component: {fileID: 397665474} + - component: {fileID: 301990982} + - component: {fileID: 301990983} m_Layer: 0 m_Name: Cell_0_1 m_TagString: Untagged @@ -308,28 +224,28 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &397665473 +--- !u!4 &301990982 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 397665472} + m_GameObject: {fileID: 301990981} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0.01, y: 1, z: 0} + m_LocalPosition: {x: 0, y: 1, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1147676901} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!212 &397665474 +--- !u!212 &301990983 SpriteRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 397665472} + m_GameObject: {fileID: 301990981} m_Enabled: 1 m_CastShadows: 0 m_ReceiveShadows: 0 @@ -364,7 +280,7 @@ SpriteRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 - m_Sprite: {fileID: 431031536} + m_Sprite: {fileID: 587689673} m_Color: {r: 1, g: 1, b: 1, a: 1} m_FlipX: 0 m_FlipY: 0 @@ -375,7 +291,91 @@ SpriteRenderer: m_WasSpriteAssigned: 1 m_MaskInteraction: 0 m_SpriteSortPoint: 0 ---- !u!213 &431031536 +--- !u!1 &372942194 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 372942195} + - component: {fileID: 372942196} + m_Layer: 0 + m_Name: Cell_0_0 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &372942195 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 372942194} + 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: 1147676901} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!212 &372942196 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 372942194} + 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_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: 0 + m_Sprite: {fileID: 587689673} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1, y: 1} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!213 &587689673 Sprite: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -402,7 +402,7 @@ Sprite: m_SpriteAtlas: {fileID: 0} m_RD: serializedVersion: 3 - texture: {fileID: 952406368} + texture: {fileID: 1427590382} alphaTexture: {fileID: 0} secondaryTextures: [] m_SubMeshes: @@ -493,7 +493,7 @@ Sprite: downscaleMultiplier: 1 m_AtlasRD: serializedVersion: 3 - texture: {fileID: 952406368} + texture: {fileID: 1427590382} alphaTexture: {fileID: 0} secondaryTextures: [] m_SubMeshes: @@ -585,7 +585,7 @@ Sprite: m_PhysicsShape: [] m_Bones: [] m_SpriteID: ---- !u!1 &451361381 +--- !u!1 &785730922 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -593,37 +593,37 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 451361382} - - component: {fileID: 451361383} + - component: {fileID: 785730923} + - component: {fileID: 785730924} m_Layer: 0 - m_Name: Cell_1_0 + m_Name: Cell_1_1 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &451361382 +--- !u!4 &785730923 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 451361381} + m_GameObject: {fileID: 785730922} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalPosition: {x: 1, y: 1, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1147676901} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!212 &451361383 +--- !u!212 &785730924 SpriteRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 451361381} + m_GameObject: {fileID: 785730922} m_Enabled: 1 m_CastShadows: 0 m_ReceiveShadows: 0 @@ -658,7 +658,7 @@ SpriteRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 - m_Sprite: {fileID: 431031536} + m_Sprite: {fileID: 587689673} m_Color: {r: 1, g: 1, b: 1, a: 1} m_FlipX: 0 m_FlipY: 0 @@ -680,6 +680,8 @@ GameObject: - component: {fileID: 791020756} - component: {fileID: 791020755} - component: {fileID: 791020754} + - component: {fileID: 791020757} + - component: {fileID: 791020758} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -761,138 +763,66 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &822843321 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 822843322} - - component: {fileID: 822843323} - m_Layer: 0 - m_Name: Cell_0_0 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &822843322 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 822843321} - 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: 1147676901} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!212 &822843323 -SpriteRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 822843321} - 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_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: 0 - m_Sprite: {fileID: 431031536} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_FlipX: 0 - m_FlipY: 0 - m_DrawMode: 0 - m_Size: {x: 1, y: 1} - m_AdaptiveModeThreshold: 0.5 - m_SpriteTileMode: 0 - m_WasSpriteAssigned: 1 - m_MaskInteraction: 0 - m_SpriteSortPoint: 0 ---- !u!28 &952406368 -Texture2D: +--- !u!114 &791020757 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 791020753} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} m_Name: - m_ImageContentsHash: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - m_IsAlphaChannelOptional: 0 - serializedVersion: 2 - m_Width: 1 - m_Height: 1 - m_CompleteImageSize: 4 - m_MipsStripped: 0 - m_TextureFormat: 4 - m_MipCount: 1 - m_IsReadable: 1 - m_IsPreProcessed: 0 - m_IgnoreMipmapLimit: 0 - m_MipmapLimitGroupName: - m_StreamingMipmaps: 0 - m_StreamingMipmapsPriority: 0 - m_VTOnly: 0 - m_AlphaIsTransparency: 0 - m_ImageCount: 1 - m_TextureDimension: 2 - m_TextureSettings: + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + 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: + quality: 3 + frameInfluence: 0.1 + jitterScale: 1 + mipBias: 0 + varianceClampScale: 0.9 + contrastAdaptiveSharpening: 0 +--- !u!114 &791020758 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 791020753} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 56666c5a40171f54783dd416a44f42bf, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EventMask: serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 1 - m_MipBias: 0 - m_WrapU: 0 - m_WrapV: 0 - m_WrapW: 0 - m_LightmapFormat: 0 - m_ColorSpace: 1 - m_PlatformBlob: - image data: 4 - _typelessdata: ff0000ff - m_StreamData: - serializedVersion: 2 - offset: 0 - size: 0 - path: + m_Bits: 4294967295 + m_MaxRayIntersections: 0 --- !u!1 &1147676900 GameObject: m_ObjectHideFlags: 0 @@ -905,8 +835,8 @@ GameObject: - component: {fileID: 1147676902} - component: {fileID: 1147676903} - component: {fileID: 1147676904} - - component: {fileID: 1147676905} - component: {fileID: 1147676906} + - component: {fileID: 1147676907} m_Layer: 0 m_Name: Shape m_TagString: Untagged @@ -927,12 +857,12 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 822843322} - - {fileID: 397665473} - - {fileID: 199240526} - - {fileID: 451361382} - - {fileID: 224755569} - - {fileID: 1662947689} + - {fileID: 372942195} + - {fileID: 301990982} + - {fileID: 2107594533} + - {fileID: 1702235238} + - {fileID: 785730923} + - {fileID: 281764986} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1147676902 @@ -1061,25 +991,6 @@ PolygonCollider2D: - {x: -0.5, y: 2.5} - {x: -0.5, y: 1.5} m_UseDelaunayMesh: 0 ---- !u!114 &1147676905 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1147676900} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6ad01079e32d2314eb3719ead5f50ddb, type: 3} - m_Name: - m_EditorClassIdentifier: - isDraggable: 1 - snapDistance: 0.5 - targetGridComponent: {fileID: 1928610078} - snapColor: {r: 0, g: 1, b: 0, a: 0.7} - invalidColor: {r: 1, g: 0, b: 0, a: 0.7} - normalColor: {r: 1, g: 1, b: 1, a: 1} - dragScale: 1.1 --- !u!114 &1147676906 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1125,6 +1036,73 @@ MonoBehaviour: callback: m_PersistentCalls: m_Calls: [] +--- !u!114 &1147676907 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1147676900} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 62aeab6b39ab40949ab3e66462c5e295, type: 3} + m_Name: + m_EditorClassIdentifier: + isDraggable: 1 + snapDistance: 0.5 + targetGrid: {fileID: 1928610078} + snapColor: {r: 0, g: 1, b: 0, a: 0.7} + invalidColor: {r: 1, g: 0, b: 0, a: 0.7} + normalColor: {r: 1, g: 1, b: 1, a: 1} + dragScale: 1.1 +--- !u!28 &1427590382 +Texture2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 2 + m_Width: 1 + m_Height: 1 + m_CompleteImageSize: 4 + m_MipsStripped: 0 + m_TextureFormat: 4 + m_MipCount: 1 + m_IsReadable: 1 + m_IsPreProcessed: 0 + m_IgnoreMipmapLimit: 0 + m_MipmapLimitGroupName: + m_StreamingMipmaps: 0 + m_StreamingMipmapsPriority: 0 + m_VTOnly: 0 + m_AlphaIsTransparency: 0 + m_ImageCount: 1 + m_TextureDimension: 2 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 1 + m_MipBias: 0 + m_WrapU: 0 + m_WrapV: 0 + m_WrapW: 0 + m_LightmapFormat: 0 + m_ColorSpace: 1 + m_PlatformBlob: + image data: 4 + _typelessdata: ff0000ff + m_StreamData: + serializedVersion: 2 + offset: 0 + size: 0 + path: --- !u!1 &1429030510 GameObject: m_ObjectHideFlags: 0 @@ -1157,7 +1135,7 @@ Transform: - {fileID: 1928610076} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1662947688 +--- !u!1 &1467061558 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1165,38 +1143,120 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1662947689} - - component: {fileID: 1662947690} + - component: {fileID: 1467061559} + - component: {fileID: 1467061561} + - component: {fileID: 1467061560} + - component: {fileID: 1467061562} m_Layer: 0 - m_Name: Cell_1_2 + m_Name: EventSystem m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1662947689 +--- !u!4 &1467061559 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1662947688} + m_GameObject: {fileID: 1467061558} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 1, y: 2, z: 0} + m_LocalPosition: {x: 0, y: 0, z: -10} + 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 &1467061560 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1467061558} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1467061561 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1467061558} + 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!114 &1467061562 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1467061558} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f55689aa6dac4461bba273d8987762dd, type: 3} + m_Name: + m_EditorClassIdentifier: + isLocked: 0 +--- !u!1 &1702235237 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1702235238} + - component: {fileID: 1702235239} + m_Layer: 0 + m_Name: Cell_1_0 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1702235238 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1702235237} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1147676901} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!212 &1662947690 +--- !u!212 &1702235239 SpriteRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1662947688} - m_Enabled: 0 + m_GameObject: {fileID: 1702235237} + m_Enabled: 1 m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 1 @@ -1230,7 +1290,7 @@ SpriteRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 - m_Sprite: {fileID: 431031536} + m_Sprite: {fileID: 587689673} m_Color: {r: 1, g: 1, b: 1, a: 1} m_FlipX: 0 m_FlipY: 0 @@ -1319,10 +1379,95 @@ MonoBehaviour: emptyCellColor: {r: 0.9, g: 0.9, b: 0.9, a: 0.2} occupiedCellColor: {r: 0.2, g: 0.6, b: 1, a: 0.5} showCellStates: 1 +--- !u!1 &2107594532 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2107594533} + - component: {fileID: 2107594534} + m_Layer: 0 + m_Name: Cell_0_2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2107594533 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2107594532} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1147676901} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!212 &2107594534 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2107594532} + 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_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: 0 + m_Sprite: {fileID: 587689673} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1, y: 1} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 m_Roots: + - {fileID: 1467061559} - {fileID: 791020756} - {fileID: 1429030511} - {fileID: 1147676901} diff --git a/Assets/Scripts/Framework/EventSystemKit/EventTriggerEx.cs b/Assets/Scripts/Framework/EventSystemKit/EventTriggerEx.cs index c50daa9e1..8b5b48653 100644 --- a/Assets/Scripts/Framework/EventSystemKit/EventTriggerEx.cs +++ b/Assets/Scripts/Framework/EventSystemKit/EventTriggerEx.cs @@ -120,6 +120,12 @@ namespace AibisDream.Framework EventSystemEx.Instance.OnEndDrag(_interaction); base.OnBeginDrag(eventData); } + + public override void OnPointerClick(PointerEventData eventData) + { + // EventSystemEx.Instance.OnPointerClick(_interaction); + base.OnPointerClick(eventData); + } } public interface IInteraction diff --git a/Assets/Scripts/MiniGame/BlockPuzzle/Class/BlockPuzzleGrid.cs b/Assets/Scripts/MiniGame/BlockPuzzle/Class/BlockPuzzleGrid.cs index bb939ed1d..526dea379 100644 --- a/Assets/Scripts/MiniGame/BlockPuzzle/Class/BlockPuzzleGrid.cs +++ b/Assets/Scripts/MiniGame/BlockPuzzle/Class/BlockPuzzleGrid.cs @@ -96,7 +96,7 @@ namespace AibisDream if (!IsValidPosition(x, y)) { Debug.LogWarning($"BlockPuzzleGridComponent: 尝试访问无效位置 ({x}, {y})"); - return GridCellState.Empty; + return GridCellState.OutOfBounds; } return _grid[x, y]; @@ -129,22 +129,20 @@ namespace AibisDream return IsValidPosition(x, y) && GetCellState(x, y) == GridCellState.Empty; } - public bool CanPlace(Vector2Int[] gridCells, out bool[] results) + public bool CanPlace(Vector2Int[] gridCells) { - results = new bool[gridCells.Length]; for (int i = 0; i < gridCells.Length; i++) { // 先验证是否在有效范围内 - if (!IsValidPosition(gridCells[i].x, gridCells[i].y)) results[i] = false; + if (!IsValidPosition(gridCells[i].x, gridCells[i].y)) + { + return false; + } // 再验证是否为空 - else if (GetCellState(gridCells[i].x, gridCells[i].y) == GridCellState.Occupied) results[i] = false; - else results[i] = true; - } - - // 如果所有位置都可以放置,则返回true - for (int i = 0; i < results.Length; i++) - { - if (!results[i]) return false; + else if (GetCellState(gridCells[i].x, gridCells[i].y) == GridCellState.Occupied) + { + return false; + } } return true; } diff --git a/Assets/Scripts/MiniGame/BlockPuzzle/Class/BlockPuzzleGridEx.cs b/Assets/Scripts/MiniGame/BlockPuzzle/Class/BlockPuzzleGridEx.cs index 359760bd3..9e5ba0c24 100644 --- a/Assets/Scripts/MiniGame/BlockPuzzle/Class/BlockPuzzleGridEx.cs +++ b/Assets/Scripts/MiniGame/BlockPuzzle/Class/BlockPuzzleGridEx.cs @@ -4,7 +4,7 @@ namespace AibisDream { public static class BlockPuzzleGridEx { - public static SnapResult TrySnapToGrid(this IBlockPuzzleGrid grid, BlockShape shape) + public static SnapResult CheckSnapToGrid(this IBlockPuzzleGrid grid, BlockShape shape) { // 预制错误结果作为返回值 SnapResult result = new SnapResult @@ -13,7 +13,8 @@ namespace AibisDream snapPosition = shape.transform.position, gridX = 0, gridY = 0, - distance = float.MaxValue + distance = float.MaxValue, + gridPositions = new Vector2Int[0] }; // 将Shape的世界坐标转换为网格坐标(可以是虚拟坐标) @@ -26,9 +27,10 @@ namespace AibisDream result.gridX = gridX; result.gridY = gridY; result.snapPosition = grid.GridToWorld(gridX, gridY); + result.gridPositions = gridCells; // 逐个坐标验证是否可以放置 - var canPlace = grid.CanPlace(gridCells, out bool[] results); + var canPlace = grid.CanPlace(gridCells); if (!canPlace) return result; result.canSnap = true; result.distance = Vector3.Distance(shape.transform.position, result.snapPosition); @@ -72,5 +74,23 @@ namespace AibisDream return gridCells; } + + /// + /// 为吸附制作预览 + /// + /// 转换后的网格坐标组 + public static void ShowSnapPreview(this IBlockPuzzleGrid grid, Vector2Int[] shapeCells) + { + + } + + public static void TrySnapToGrid(this IBlockPuzzleGrid grid, BlockShape shape, Vector2Int rootCell) + { + // 判断RootCell的位置 + var rootWorldPos = grid.GridToWorld(rootCell.x, rootCell.y); + // 已经判断是否可吸附,直接吸就好了 + shape.transform.position = rootWorldPos; + // TODO: 设置网格状态 + } } } \ No newline at end of file diff --git a/Assets/Scripts/MiniGame/BlockPuzzle/Class/BlockShapeDragger.cs b/Assets/Scripts/MiniGame/BlockPuzzle/Class/BlockShapeDragger.cs index 158cfd95a..b352882d9 100644 --- a/Assets/Scripts/MiniGame/BlockPuzzle/Class/BlockShapeDragger.cs +++ b/Assets/Scripts/MiniGame/BlockPuzzle/Class/BlockShapeDragger.cs @@ -130,7 +130,7 @@ namespace AibisDream if (targetGrid != null) { // 检查吸附可能 - var snapResult = targetGrid.TrySnapToGrid(_blockShape); + var snapResult = targetGrid.CheckSnapToGrid(_blockShape); if (snapResult.canSnap) { // 可以吸附,保存吸附内容 diff --git a/Assets/Scripts/MiniGame/BlockPuzzle/Class/PlacementValidator.cs b/Assets/Scripts/MiniGame/BlockPuzzle/Class/PlacementValidator.cs index 0285ef491..9e5fdc984 100644 --- a/Assets/Scripts/MiniGame/BlockPuzzle/Class/PlacementValidator.cs +++ b/Assets/Scripts/MiniGame/BlockPuzzle/Class/PlacementValidator.cs @@ -310,6 +310,8 @@ namespace AibisDream public int gridX; // 吸附到的网格X坐标(形状左下角位置) public int gridY; // 吸附到的网格Y坐标(形状左下角位置) public float distance; // 到网格单元格的距离 + public Vector2Int[] gridPositions; // 吸附后 + public Vector2Int RootCell => new Vector2Int(gridX, gridY); // 吸附后的根网格坐标 } } diff --git a/Assets/Scripts/MiniGame/BlockPuzzle/Class/ShapeDragger.cs b/Assets/Scripts/MiniGame/BlockPuzzle/Class/ShapeDragger.cs new file mode 100644 index 000000000..3f7a0bfe3 --- /dev/null +++ b/Assets/Scripts/MiniGame/BlockPuzzle/Class/ShapeDragger.cs @@ -0,0 +1,180 @@ +using System; +using AibisDream.Framework; +using UnityEngine; +using UnityEngine.EventSystems; + +namespace AibisDream +{ + public class ShapeDragger : MonoBehaviour, IBlockShapeDragger, IInteraction + { + [Header("拖拽设置")] + [SerializeField] private bool isDraggable = true; + [SerializeField] private float snapDistance = 0.5f; + [SerializeField] private BlockPuzzleGrid targetGrid; + + [Header("视觉反馈")] + [SerializeField] private Color snapColor = new Color(0f, 1f, 0f, 0.7f); + [SerializeField] private Color invalidColor = new Color(1f, 0f, 0f, 0.7f); + [SerializeField] private Color normalColor = Color.white; + [SerializeField] private float dragScale = 1.1f; + + // 拖拽状态 + private DragState _currentState = DragState.Idle; + private Vector3 _dragOffset; + private Vector3 _originalPosition; + private Vector3 _originalScale; + private int _originalSortingOrder; + private SnapResult _snapResult; + + // 组件引用 + private BlockShape _blockShape; + private SpriteRenderer _spriteRenderer; + private EventTriggerEx _eventTrigger; + + public DragState CurrentState => _currentState; + + public bool IsDraggable { get => isDraggable; set => isDraggable = value; } + public IBlockPuzzleGrid TargetGrid { get => targetGrid; set => targetGrid = value as BlockPuzzleGrid; } + public float SnapDistance { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + + // 事件 + public event Action OnDragStart; + public event Action OnDragUpdate; + public event Action OnDragEnd; + public event Action OnSnap; + public event Action OnUnsnap; + + private void Awake() + { + _blockShape = GetComponent(); + _spriteRenderer = GetComponent(); + _eventTrigger = GetComponent(); + + RegisterEvent(); + } + + private void OnDestroy() + { + _eventTrigger.UnRegister(EventTriggerType.PointerClick, OnPointerClick); + } + + private void RegisterEvent() + { + _eventTrigger.Register(EventTriggerType.PointerClick, OnPointerClick); + // _eventTrigger.Register(EventTriggerType.PointerDown, OnPointerDown); + // _eventTrigger.Register(EventTriggerType.PointerUp, OnPointerUp); + } + + private void Update() + { + if (_currentState == DragState.Dragging) + { + UpdateDrag(); + } + } + + private void OnPointerClick(BaseEventData eventData) + { + if (eventData is not PointerEventData { button: PointerEventData.InputButton.Left }) + { + return; + } + + Vector3 mouseWorldPos = GetMouseWorldPosition(eventData); + // 如果当前物体不在拖拽中则进入拖拽逻辑 + if (_currentState == DragState.Idle || _currentState == DragState.Placed) + { + StartDrag(mouseWorldPos); + } + // 如果当前物体在拖拽中则取消拖拽 + else + { + EndDrag(); + } + } + + public void StartDrag(Vector3 mouseWorldPos) + { + if (!isDraggable) return; + + _currentState = DragState.Dragging; + _originalPosition = transform.position; + + // 计算拖拽偏移量 + _dragOffset = transform.position - mouseWorldPos; + + // 处理层级和缩放 + HandleDragStart(); + + OnDragStart?.Invoke(_blockShape); + } + + private void HandleDragStart() + { + // 调整缩放和层级 + transform.localScale = dragScale * Vector3.one; + } + + public void CancelDrag() + { + throw new NotImplementedException(); + } + + public void EndDrag() + { + // 如果吸附到了就靠过去 + if (_snapResult.canSnap) + { + _currentState = DragState.Placed; + transform.localScale = Vector3.one; + TargetGrid.TrySnapToGrid(_blockShape, _snapResult.RootCell); + } + else + { + _currentState = DragState.Idle; + transform.position = _originalPosition; + transform.localScale = Vector3.one; + } + + OnDragEnd?.Invoke(_blockShape, _currentState == DragState.Placed); + } + + public void UpdateDrag() + { + // 更新拖拽位置 + transform.position = GetMouseWorldPosition() + _dragOffset; + // 进行Snap检查 + _snapResult = TargetGrid.CheckSnapToGrid(_blockShape); + // 在网格显示预览 + TargetGrid.ShowSnapPreview(_snapResult.gridPositions); + } + + /// + /// 获取鼠标世界坐标 + /// + private Vector3 GetMouseWorldPosition(BaseEventData eventData) + { + Vector3 mouseWorldPos; + if (eventData is not PointerEventData pointerEventData) + { + mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); + } + else + { + mouseWorldPos = Camera.main.ScreenToWorldPoint(pointerEventData.position); + } + return new Vector3(mouseWorldPos.x, mouseWorldPos.y, 0); + } + + private Vector3 GetMouseWorldPosition() + { + var mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); + return new Vector3(mouseWorldPos.x, mouseWorldPos.y, 0); + } + + // 实现IInteraction接口 + public bool IsActive => true; + public bool IsAvailable => true; + public GameObject GetGameObject() => gameObject; + } +} diff --git a/Assets/Scripts/MiniGame/BlockPuzzle/Class/ShapeDragger.cs.meta b/Assets/Scripts/MiniGame/BlockPuzzle/Class/ShapeDragger.cs.meta new file mode 100644 index 000000000..30e9c4385 --- /dev/null +++ b/Assets/Scripts/MiniGame/BlockPuzzle/Class/ShapeDragger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 62aeab6b39ab40949ab3e66462c5e295 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/MiniGame/BlockPuzzle/Interface/IBlockPuzzleGrid.cs b/Assets/Scripts/MiniGame/BlockPuzzle/Interface/IBlockPuzzleGrid.cs index 3ed817396..36074d66d 100644 --- a/Assets/Scripts/MiniGame/BlockPuzzle/Interface/IBlockPuzzleGrid.cs +++ b/Assets/Scripts/MiniGame/BlockPuzzle/Interface/IBlockPuzzleGrid.cs @@ -8,7 +8,8 @@ namespace AibisDream public enum GridCellState { Empty = 0, // 空 - Occupied = 1 // 已占用 + Occupied = 1, // 已占用 + OutOfBounds = 2 // 超出范围 } /// @@ -90,7 +91,7 @@ namespace AibisDream /// 网格坐标数组 /// 结果集合 /// 是否可以放置 - bool CanPlace(Vector2Int[] gridCells, out bool[] results); + bool CanPlace(Vector2Int[] gridCells); /// /// 世界坐标转换为网格坐标 diff --git a/Assets/Scripts/MiniGame/BlockPuzzle/Interface/IBlockShapeDragger.cs b/Assets/Scripts/MiniGame/BlockPuzzle/Interface/IBlockShapeDragger.cs index e414a01c1..9f031abbc 100644 --- a/Assets/Scripts/MiniGame/BlockPuzzle/Interface/IBlockShapeDragger.cs +++ b/Assets/Scripts/MiniGame/BlockPuzzle/Interface/IBlockShapeDragger.cs @@ -91,7 +91,7 @@ namespace AibisDream /// 网格X坐标 /// 网格Y坐标 /// 是否可以放置 - bool CanPlaceAt(int gridX, int gridY); + // bool CanPlaceAt(int gridX, int gridY); /// /// 获取当前吸附的网格坐标 @@ -99,7 +99,7 @@ namespace AibisDream /// 输出的网格X坐标 /// 输出的网格Y坐标 /// 是否正在吸附 - bool GetSnapGridPosition(out int gridX, out int gridY); + // bool GetSnapGridPosition(out int gridX, out int gridY); } }