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);
}
}