diff --git a/Assets/DC/滚轮密码锁.meta b/Assets/DC/滚轮密码锁.meta
new file mode 100644
index 00000000..a68e47a8
--- /dev/null
+++ b/Assets/DC/滚轮密码锁.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 51fa0ecb305073b4eae88c6c74d8877e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/DC/滚轮密码锁.prefab b/Assets/DC/滚轮密码锁.prefab
new file mode 100644
index 00000000..f29e7a62
--- /dev/null
+++ b/Assets/DC/滚轮密码锁.prefab
@@ -0,0 +1,70 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &6839460479272970973
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 0}
+ m_Modifications:
+ - target: {fileID: -8679921383154817045, guid: 83547e64fb3952d428dc97deaff32f90,
+ type: 3}
+ propertyPath: m_LocalPosition.x
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 83547e64fb3952d428dc97deaff32f90,
+ type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0.1121
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 83547e64fb3952d428dc97deaff32f90,
+ type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 83547e64fb3952d428dc97deaff32f90,
+ type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 83547e64fb3952d428dc97deaff32f90,
+ type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 83547e64fb3952d428dc97deaff32f90,
+ type: 3}
+ propertyPath: m_LocalRotation.y
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 83547e64fb3952d428dc97deaff32f90,
+ type: 3}
+ propertyPath: m_LocalRotation.z
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 83547e64fb3952d428dc97deaff32f90,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 83547e64fb3952d428dc97deaff32f90,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: -8679921383154817045, guid: 83547e64fb3952d428dc97deaff32f90,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 919132149155446097, guid: 83547e64fb3952d428dc97deaff32f90,
+ type: 3}
+ propertyPath: m_Name
+ value: "\u6EDA\u8F6E\u5BC6\u7801\u9501"
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: 83547e64fb3952d428dc97deaff32f90, type: 3}
diff --git a/Assets/DC/滚轮密码锁.prefab.meta b/Assets/DC/滚轮密码锁.prefab.meta
new file mode 100644
index 00000000..2ca8e3ee
--- /dev/null
+++ b/Assets/DC/滚轮密码锁.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 88d455dfdb969ab48be9a2ef2eb461c9
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/DC/滚轮密码锁/aiStandardSurface1.mat b/Assets/DC/滚轮密码锁/aiStandardSurface1.mat
new file mode 100644
index 00000000..872d5aaf
--- /dev/null
+++ b/Assets/DC/滚轮密码锁/aiStandardSurface1.mat
@@ -0,0 +1,171 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &-4410094119548642556
+MonoBehaviour:
+ m_ObjectHideFlags: 11
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ version: 7
+--- !u!21 &2100000
+Material:
+ serializedVersion: 8
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: aiStandardSurface1
+ m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
+ m_Parent: {fileID: 0}
+ m_ModifiedSerializedProperties: 0
+ m_ValidKeywords:
+ - _NORMALMAP
+ m_InvalidKeywords: []
+ m_LightmapFlags: 6
+ m_EnableInstancingVariants: 0
+ m_DoubleSidedGI: 0
+ m_CustomRenderQueue: 2000
+ stringTagMap:
+ RenderType: Opaque
+ disabledShaderPasses: []
+ m_LockedProperties:
+ m_SavedProperties:
+ serializedVersion: 3
+ m_TexEnvs:
+ - _BASE_COLOR_MAP:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _BaseMap:
+ m_Texture: {fileID: 2800000, guid: b4cc8449600eeb749a5a6265f3f617ab, type: 3}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _BumpMap:
+ m_Texture: {fileID: 2800000, guid: a28009a824ff4f3429289236000387c5, type: 3}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _DetailAlbedoMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _DetailMask:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _DetailNormalMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _EMISSION_COLOR_MAP:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _EmissionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _METALNESS_MAP:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _MainTex:
+ m_Texture: {fileID: 2800000, guid: b4cc8449600eeb749a5a6265f3f617ab, type: 3}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _MetallicGlossMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _NORMAL_MAP:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _OcclusionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _ParallaxMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _SPECULAR_COLOR_MAP:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _SPECULAR_IOR_MAP:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _SPECULAR_ROUGHNESS_MAP:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _SpecGlossMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - unity_Lightmaps:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - unity_LightmapsInd:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - unity_ShadowMasks:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ m_Ints: []
+ m_Floats:
+ - _AlphaClip: 0
+ - _AlphaToMask: 0
+ - _Blend: 0
+ - _BlendModePreserveSpecular: 1
+ - _BumpScale: 1
+ - _ClearCoatMask: 0
+ - _ClearCoatSmoothness: 0
+ - _Cull: 2
+ - _Cutoff: 0.5
+ - _DetailAlbedoMapScale: 1
+ - _DetailNormalMapScale: 1
+ - _DstBlend: 0
+ - _DstBlendAlpha: 0
+ - _EnvironmentReflections: 1
+ - _GlossMapScale: 1
+ - _Glossiness: 0.2
+ - _GlossyReflections: 1
+ - _METALNESS: 0
+ - _Metallic: 0.5
+ - _Mode: 3
+ - _OcclusionStrength: 1
+ - _Parallax: 0.02
+ - _QueueControl: 0
+ - _QueueOffset: 0
+ - _ReceiveShadows: 1
+ - _SPECULAR_IOR: 1.5
+ - _SPECULAR_ROUGHNESS: 0.2
+ - _Smoothness: 0.49
+ - _SmoothnessTextureChannel: 0
+ - _SpecularHighlights: 1
+ - _SrcBlend: 1
+ - _SrcBlendAlpha: 1
+ - _Surface: 0
+ - _UVSec: 0
+ - _WorkflowMode: 1
+ - _ZWrite: 1
+ m_Colors:
+ - _BASE_COLOR: {r: 1, g: 1, b: 1, a: 1}
+ - _BaseColor: {r: 1, g: 1, b: 1, a: 1}
+ - _Color: {r: 1, g: 1, b: 1, a: 1}
+ - _EMISSION_COLOR: {r: 0, g: 0, b: 0, a: 0}
+ - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+ - _SPECULAR_COLOR: {r: 1, g: 1, b: 1, a: 1}
+ - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
+ m_BuildTextureStacks: []
diff --git a/Assets/DC/滚轮密码锁/aiStandardSurface1.mat.meta b/Assets/DC/滚轮密码锁/aiStandardSurface1.mat.meta
new file mode 100644
index 00000000..842967f8
--- /dev/null
+++ b/Assets/DC/滚轮密码锁/aiStandardSurface1.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 90be0fbc8e337884fb7a4906e74dd866
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 2100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/DC/滚轮密码锁/mm_standardSurface1_BaseColor.png b/Assets/DC/滚轮密码锁/mm_standardSurface1_BaseColor.png
new file mode 100644
index 00000000..8ae37e34
Binary files /dev/null and b/Assets/DC/滚轮密码锁/mm_standardSurface1_BaseColor.png differ
diff --git a/Assets/DC/滚轮密码锁/mm_standardSurface1_BaseColor.png.meta b/Assets/DC/滚轮密码锁/mm_standardSurface1_BaseColor.png.meta
new file mode 100644
index 00000000..4a242491
--- /dev/null
+++ b/Assets/DC/滚轮密码锁/mm_standardSurface1_BaseColor.png.meta
@@ -0,0 +1,127 @@
+fileFormatVersion: 2
+guid: b4cc8449600eeb749a5a6265f3f617ab
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Android
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/DC/滚轮密码锁/mm_standardSurface1_Normal.png b/Assets/DC/滚轮密码锁/mm_standardSurface1_Normal.png
new file mode 100644
index 00000000..f904c149
Binary files /dev/null and b/Assets/DC/滚轮密码锁/mm_standardSurface1_Normal.png differ
diff --git a/Assets/DC/滚轮密码锁/mm_standardSurface1_Normal.png.meta b/Assets/DC/滚轮密码锁/mm_standardSurface1_Normal.png.meta
new file mode 100644
index 00000000..3eda939b
--- /dev/null
+++ b/Assets/DC/滚轮密码锁/mm_standardSurface1_Normal.png.meta
@@ -0,0 +1,127 @@
+fileFormatVersion: 2
+guid: a28009a824ff4f3429289236000387c5
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 13
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 0
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 1
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Android
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/DC/滚轮密码锁/滚轮密码锁.fbx b/Assets/DC/滚轮密码锁/滚轮密码锁.fbx
new file mode 100644
index 00000000..2ec9fbff
Binary files /dev/null and b/Assets/DC/滚轮密码锁/滚轮密码锁.fbx differ
diff --git a/Assets/DC/滚轮密码锁/滚轮密码锁.fbx.meta b/Assets/DC/滚轮密码锁/滚轮密码锁.fbx.meta
new file mode 100644
index 00000000..18d5ea23
--- /dev/null
+++ b/Assets/DC/滚轮密码锁/滚轮密码锁.fbx.meta
@@ -0,0 +1,114 @@
+fileFormatVersion: 2
+guid: 83547e64fb3952d428dc97deaff32f90
+ModelImporter:
+ serializedVersion: 22200
+ internalIDToNameTable: []
+ externalObjects:
+ - first:
+ type: UnityEngine:Material
+ assembly: UnityEngine.CoreModule
+ name: aiStandardSurface1
+ second: {fileID: 2100000, guid: 90be0fbc8e337884fb7a4906e74dd866, type: 2}
+ materials:
+ materialImportMode: 2
+ materialName: 0
+ materialSearch: 1
+ materialLocation: 1
+ animations:
+ legacyGenerateAnimations: 4
+ bakeSimulation: 0
+ resampleCurves: 1
+ optimizeGameObjects: 0
+ removeConstantScaleCurves: 0
+ motionNodeName:
+ rigImportErrors:
+ rigImportWarnings:
+ animationImportErrors:
+ animationImportWarnings:
+ animationRetargetingWarnings:
+ animationDoRetargetingWarnings: 0
+ importAnimatedCustomProperties: 0
+ importConstraints: 0
+ animationCompression: 1
+ animationRotationError: 0.5
+ animationPositionError: 0.5
+ animationScaleError: 0.5
+ animationWrapMode: 0
+ extraExposedTransformPaths: []
+ extraUserProperties: []
+ clipAnimations: []
+ isReadable: 0
+ meshes:
+ lODScreenPercentages: []
+ globalScale: 1
+ meshCompression: 0
+ addColliders: 0
+ useSRGBMaterialColor: 1
+ sortHierarchyByName: 1
+ importPhysicalCameras: 1
+ importVisibility: 1
+ importBlendShapes: 1
+ importCameras: 1
+ importLights: 1
+ nodeNameCollisionStrategy: 1
+ fileIdsGeneration: 2
+ swapUVChannels: 0
+ generateSecondaryUV: 0
+ useFileUnits: 1
+ keepQuads: 0
+ weldVertices: 1
+ bakeAxisConversion: 0
+ preserveHierarchy: 0
+ skinWeightsMode: 0
+ maxBonesPerVertex: 4
+ minBoneWeight: 0.001
+ optimizeBones: 1
+ meshOptimizationFlags: -1
+ indexFormat: 0
+ secondaryUVAngleDistortion: 8
+ secondaryUVAreaDistortion: 15.000001
+ secondaryUVHardAngle: 88
+ secondaryUVMarginMethod: 1
+ secondaryUVMinLightmapResolution: 40
+ secondaryUVMinObjectScale: 1
+ secondaryUVPackMargin: 4
+ useFileScale: 1
+ strictVertexDataChecks: 0
+ tangentSpace:
+ normalSmoothAngle: 60
+ normalImportMode: 0
+ tangentImportMode: 3
+ normalCalculationMode: 4
+ legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
+ blendShapeNormalImportMode: 1
+ normalSmoothingSource: 0
+ referencedClips: []
+ importAnimation: 1
+ humanDescription:
+ serializedVersion: 3
+ human: []
+ skeleton: []
+ armTwist: 0.5
+ foreArmTwist: 0.5
+ upperLegTwist: 0.5
+ legTwist: 0.5
+ armStretch: 0.05
+ legStretch: 0.05
+ feetSpacing: 0
+ globalScale: 1
+ rootMotionBoneName:
+ hasTranslationDoF: 0
+ hasExtraRoot: 0
+ skeletonHasParents: 1
+ lastHumanDescriptionAvatarSource: {instanceID: 0}
+ autoGenerateAvatarMappingIfUnspecified: 1
+ animationType: 2
+ humanoidOversampling: 1
+ avatarSetup: 0
+ addHumanoidExtraRootOnlyWhenUsingAvatar: 1
+ importBlendShapeDeformPercent: 1
+ remapMaterialsIfMaterialImportModeIsNone: 0
+ additionalBone: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Arcadia/Materials/MRWater.mat b/Assets/_Arcadia/Materials/MRWater.mat
index da606b69..0b12d008 100644
--- a/Assets/_Arcadia/Materials/MRWater.mat
+++ b/Assets/_Arcadia/Materials/MRWater.mat
@@ -142,7 +142,7 @@ Material:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _DepthColor: {r: 0.05, g: 0.2, b: 0.35, a: 1}
- _DripRipplePositions: {r: -0.35680002, g: 1.8154, b: -0.35680002, a: 1.8154}
- - _DripRippleTimes: {r: 24.78042, g: 26.78164, b: -10, a: -10}
+ - _DripRippleTimes: {r: 136.97975, g: 134.97751, b: -10, a: -10}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _FresnelColor: {r: 0.8, g: 0.9, b: 1, a: 1}
- _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
diff --git a/Assets/_Arcadia/Prefabs/Item/JadeRing/JadeRing.prefab b/Assets/_Arcadia/Prefabs/Item/JadeRing/JadeRing.prefab
index 750e4eef..09142ec8 100644
--- a/Assets/_Arcadia/Prefabs/Item/JadeRing/JadeRing.prefab
+++ b/Assets/_Arcadia/Prefabs/Item/JadeRing/JadeRing.prefab
@@ -15,7 +15,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
- m_IsActive: 1
+ m_IsActive: 0
--- !u!4 &3832839186908490715
Transform:
m_ObjectHideFlags: 0
diff --git a/Assets/_Arcadia/Prefabs/PuzzleFragment/0.prefab b/Assets/_Arcadia/Prefabs/PuzzleFragment/0.prefab
index 6c1fcbef..cc671562 100644
--- a/Assets/_Arcadia/Prefabs/PuzzleFragment/0.prefab
+++ b/Assets/_Arcadia/Prefabs/PuzzleFragment/0.prefab
@@ -107,8 +107,8 @@ MonoBehaviour:
isGrabbed: 0
puzzleTable: {fileID: 0}
currentSlot: {fileID: 0}
- rb: {fileID: 0}
- fragmentCollider: {fileID: 0}
+ rb: {fileID: -8351497618002639265}
+ fragmentCollider: {fileID: 3838324254599613900}
grabFollowSpeed: 20
normalMaterial: {fileID: 0}
highlightMaterial: {fileID: 0}
@@ -164,8 +164,8 @@ Rigidbody:
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
- m_UseGravity: 1
- m_IsKinematic: 0
+ m_UseGravity: 0
+ m_IsKinematic: 1
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0
diff --git a/Assets/_Arcadia/Prefabs/PuzzleFragment/1.prefab b/Assets/_Arcadia/Prefabs/PuzzleFragment/1.prefab
index f7410b9d..806bb74f 100644
--- a/Assets/_Arcadia/Prefabs/PuzzleFragment/1.prefab
+++ b/Assets/_Arcadia/Prefabs/PuzzleFragment/1.prefab
@@ -107,8 +107,8 @@ MonoBehaviour:
isGrabbed: 0
puzzleTable: {fileID: 0}
currentSlot: {fileID: 0}
- rb: {fileID: 0}
- fragmentCollider: {fileID: 0}
+ rb: {fileID: -2704628964027859501}
+ fragmentCollider: {fileID: 4100094780248623792}
grabFollowSpeed: 20
normalMaterial: {fileID: 0}
highlightMaterial: {fileID: 0}
@@ -164,8 +164,8 @@ Rigidbody:
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
- m_UseGravity: 1
- m_IsKinematic: 0
+ m_UseGravity: 0
+ m_IsKinematic: 1
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0
diff --git a/Assets/_Arcadia/Prefabs/PuzzleFragment/2.prefab b/Assets/_Arcadia/Prefabs/PuzzleFragment/2.prefab
index d86cd395..a45272f2 100644
--- a/Assets/_Arcadia/Prefabs/PuzzleFragment/2.prefab
+++ b/Assets/_Arcadia/Prefabs/PuzzleFragment/2.prefab
@@ -164,8 +164,8 @@ Rigidbody:
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
- m_UseGravity: 1
- m_IsKinematic: 0
+ m_UseGravity: 0
+ m_IsKinematic: 1
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0
diff --git a/Assets/_Arcadia/Prefabs/PuzzleFragment/3.prefab b/Assets/_Arcadia/Prefabs/PuzzleFragment/3.prefab
index 6104f06d..4538bf8e 100644
--- a/Assets/_Arcadia/Prefabs/PuzzleFragment/3.prefab
+++ b/Assets/_Arcadia/Prefabs/PuzzleFragment/3.prefab
@@ -164,8 +164,8 @@ Rigidbody:
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
- m_UseGravity: 1
- m_IsKinematic: 0
+ m_UseGravity: 0
+ m_IsKinematic: 1
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0
diff --git a/Assets/_Arcadia/Prefabs/PuzzleFragment/4.prefab b/Assets/_Arcadia/Prefabs/PuzzleFragment/4.prefab
index f12d0c47..ae7c2b5a 100644
--- a/Assets/_Arcadia/Prefabs/PuzzleFragment/4.prefab
+++ b/Assets/_Arcadia/Prefabs/PuzzleFragment/4.prefab
@@ -164,8 +164,8 @@ Rigidbody:
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
- m_UseGravity: 1
- m_IsKinematic: 0
+ m_UseGravity: 0
+ m_IsKinematic: 1
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0
diff --git a/Assets/_Arcadia/Prefabs/PuzzleFragment/5.prefab b/Assets/_Arcadia/Prefabs/PuzzleFragment/5.prefab
index e4989608..6f3a158e 100644
--- a/Assets/_Arcadia/Prefabs/PuzzleFragment/5.prefab
+++ b/Assets/_Arcadia/Prefabs/PuzzleFragment/5.prefab
@@ -164,8 +164,8 @@ Rigidbody:
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
- m_UseGravity: 1
- m_IsKinematic: 0
+ m_UseGravity: 0
+ m_IsKinematic: 1
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0
diff --git a/Assets/_Arcadia/Prefabs/PuzzleFragment/6.prefab b/Assets/_Arcadia/Prefabs/PuzzleFragment/6.prefab
index 43638a9d..99606e77 100644
--- a/Assets/_Arcadia/Prefabs/PuzzleFragment/6.prefab
+++ b/Assets/_Arcadia/Prefabs/PuzzleFragment/6.prefab
@@ -164,8 +164,8 @@ Rigidbody:
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
- m_UseGravity: 1
- m_IsKinematic: 0
+ m_UseGravity: 0
+ m_IsKinematic: 1
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0
diff --git a/Assets/_Arcadia/Prefabs/PuzzleFragment/7.prefab b/Assets/_Arcadia/Prefabs/PuzzleFragment/7.prefab
index a1aba7db..0c092c99 100644
--- a/Assets/_Arcadia/Prefabs/PuzzleFragment/7.prefab
+++ b/Assets/_Arcadia/Prefabs/PuzzleFragment/7.prefab
@@ -164,8 +164,8 @@ Rigidbody:
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
- m_UseGravity: 1
- m_IsKinematic: 0
+ m_UseGravity: 0
+ m_IsKinematic: 1
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0
diff --git a/Assets/_Arcadia/Prefabs/PuzzleFragment/8.prefab b/Assets/_Arcadia/Prefabs/PuzzleFragment/8.prefab
index dd4093eb..c4ff58c0 100644
--- a/Assets/_Arcadia/Prefabs/PuzzleFragment/8.prefab
+++ b/Assets/_Arcadia/Prefabs/PuzzleFragment/8.prefab
@@ -164,8 +164,8 @@ Rigidbody:
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
- m_UseGravity: 1
- m_IsKinematic: 0
+ m_UseGravity: 0
+ m_IsKinematic: 1
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0
diff --git a/Assets/_Arcadia/Scenes/GongSi1Lou.unity b/Assets/_Arcadia/Scenes/GongSi1Lou.unity
index 18dfd2dd..40ddefd0 100644
--- a/Assets/_Arcadia/Scenes/GongSi1Lou.unity
+++ b/Assets/_Arcadia/Scenes/GongSi1Lou.unity
@@ -20677,6 +20677,83 @@ MonoBehaviour:
m_Flags: 0
m_Reference: {fileID: 0}
m_ButtonPressPoint: 0.5
+--- !u!1001 &1144253457
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 0}
+ m_Modifications:
+ - target: {fileID: 2099039037632757708, guid: 88d455dfdb969ab48be9a2ef2eb461c9, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 0.9573791
+ objectReference: {fileID: 0}
+ - target: {fileID: 2099039037632757708, guid: 88d455dfdb969ab48be9a2ef2eb461c9, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0.28883433
+ objectReference: {fileID: 0}
+ - target: {fileID: 2099039037632757708, guid: 88d455dfdb969ab48be9a2ef2eb461c9, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2099039037632757708, guid: 88d455dfdb969ab48be9a2ef2eb461c9, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2099039037632757708, guid: 88d455dfdb969ab48be9a2ef2eb461c9, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 33.576
+ objectReference: {fileID: 0}
+ - target: {fileID: 5921051261296072588, guid: 88d455dfdb969ab48be9a2ef2eb461c9, type: 3}
+ propertyPath: m_Name
+ value: "\u6EDA\u8F6E\u5BC6\u7801\u9501"
+ objectReference: {fileID: 0}
+ - target: {fileID: 6440178721027394870, guid: 88d455dfdb969ab48be9a2ef2eb461c9, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0.36593473
+ objectReference: {fileID: 0}
+ - target: {fileID: 6440178721027394870, guid: 88d455dfdb969ab48be9a2ef2eb461c9, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0.5
+ objectReference: {fileID: 0}
+ - target: {fileID: 6440178721027394870, guid: 88d455dfdb969ab48be9a2ef2eb461c9, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 2.43367
+ objectReference: {fileID: 0}
+ - target: {fileID: 6440178721027394870, guid: 88d455dfdb969ab48be9a2ef2eb461c9, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6440178721027394870, guid: 88d455dfdb969ab48be9a2ef2eb461c9, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6440178721027394870, guid: 88d455dfdb969ab48be9a2ef2eb461c9, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6440178721027394870, guid: 88d455dfdb969ab48be9a2ef2eb461c9, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6440178721027394870, guid: 88d455dfdb969ab48be9a2ef2eb461c9, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6440178721027394870, guid: 88d455dfdb969ab48be9a2ef2eb461c9, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6440178721027394870, guid: 88d455dfdb969ab48be9a2ef2eb461c9, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: 88d455dfdb969ab48be9a2ef2eb461c9, type: 3}
--- !u!1 &1151815201
GameObject:
m_ObjectHideFlags: 0
@@ -35053,7 +35130,7 @@ Transform:
m_GameObject: {fileID: 919132147986095121}
serializedVersion: 2
m_LocalRotation: {x: -0.5, y: 0.5, z: 0.5, w: 0.5}
- m_LocalPosition: {x: 0.0767, y: 0.266, z: 0}
+ m_LocalPosition: {x: 0, y: 0.332, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
@@ -36534,6 +36611,7 @@ MonoBehaviour:
coinPlatform: {fileID: 1862316938}
hiddenCoinEvent: {fileID: 2030637937}
coinPre: {fileID: 3319392377428400056, guid: 8876522d7f04c4241b19f30a4c0f4ede, type: 3}
+ currentEventState: 0
GuideArrowPre: {fileID: 718552219040796497, guid: 1090ff9efb8eaa94cbdc6dfa4042d3b7, type: 3}
--- !u!33 &4175203583539743826
MeshFilter:
@@ -38485,3 +38563,4 @@ SceneRoots:
- {fileID: 1018358334}
- {fileID: 198656620}
- {fileID: 933166546}
+ - {fileID: 1144253457}
diff --git a/Assets/_Arcadia/Scripts/Base/GameManager.cs b/Assets/_Arcadia/Scripts/Base/GameManager.cs
index 87ef8a73..f9f73896 100644
--- a/Assets/_Arcadia/Scripts/Base/GameManager.cs
+++ b/Assets/_Arcadia/Scripts/Base/GameManager.cs
@@ -33,6 +33,20 @@ public enum GameState
Settle
}
+///
+/// 事件状态 - 玩家当前参与的事件
+///
+public enum EventState
+{
+ None = 0, // 未参与任何事件
+ PuzzleTable = 1, // 拼图台事件
+ MonkeyBasket = 2, // 猴子投篮事件
+ TreasureBox = 3, // 宝箱密码事件
+ Stalactite = 4, // 钟乳石事件
+ MapFragment = 5, // 地图碎片收集事件
+ NumberGearBox = 6 // 滚轮密码锁事件
+}
+
public class GameManager : MonoBehaviour
{
public static GameManager Ins { get; private set; }
@@ -64,6 +78,56 @@ public class GameManager : MonoBehaviour
public HiddenCoinEvent hiddenCoinEvent; // 隐藏事件管理器
public GameObject coinPre;
+ #region 事件状态管理
+
+ [Header("事件状态")]
+ public EventState currentEventState = EventState.None; // 当前参与的事件
+
+ ///
+ /// 检查是否可以触发指定事件
+ /// 玩家未参与任何事件时可以触发,或已在同一事件中可继续
+ ///
+ public bool CanTriggerEvent(EventState eventToTrigger)
+ {
+ return currentEventState == EventState.None || currentEventState == eventToTrigger;
+ }
+
+ ///
+ /// 设置当前事件状态
+ ///
+ public void SetEventState(EventState state)
+ {
+ currentEventState = state;
+ Debug.Log($"事件状态切换为: {state}");
+ }
+
+ ///
+ /// 清除事件状态(事件结束)
+ ///
+ public void ClearEventState()
+ {
+ currentEventState = EventState.None;
+ Debug.Log("事件状态已清除");
+ }
+
+ ///
+ /// 获取当前事件状态
+ ///
+ public EventState GetCurrentEventState()
+ {
+ return currentEventState;
+ }
+
+ ///
+ /// 检查是否正在参与某个事件
+ ///
+ public bool IsInAnyEvent()
+ {
+ return currentEventState != EventState.None;
+ }
+
+ #endregion
+
#region 指引系统
// 新增:指引系统
diff --git a/Assets/_Arcadia/Scripts/Item/MapFragment.cs b/Assets/_Arcadia/Scripts/Item/MapFragment.cs
index dc25fd76..9e24919e 100644
--- a/Assets/_Arcadia/Scripts/Item/MapFragment.cs
+++ b/Assets/_Arcadia/Scripts/Item/MapFragment.cs
@@ -60,6 +60,12 @@ public class MapFragment : MonoBehaviour
private Renderer fragmentRenderer;
private Material fragmentMaterial;
+ // 全局静态变量:当前被抓取的碎片(限制每次只能抓取一个)
+ private static MapFragment currentlyGrabbedMapFragment = null;
+
+ // 触发器检测:右手是否在碎片范围内
+ private bool rightHandInTrigger = false;
+
public int FragmentId => fragmentId;
public int CorrectSlotId => correctSlotId;
public bool IsInStorageZone => inStorageZone;
@@ -456,19 +462,90 @@ public class MapFragment : MonoBehaviour
///
/// 检测右手交互
+ /// 条件:触发器检测右手进入 + (扳机或鼠标左键) + 当前没有其他碎片被抓取
///
private void CheckRightHandInteraction()
{
+ // 必须右手在触发器范围内
+ if (!rightHandInTrigger) return;
+
RightHand rightHand = FindObjectOfType();
if (rightHand == null) return;
- float distance = Vector3.Distance(transform.position, rightHand.transform.position);
+ // 检测扳机或鼠标左键
+ bool triggerPressed = rightHand.isTrigger;
- // 检测抓取(使用isTrigger代替IsGrabbing)
- if (rightHand.isTrigger && distance < 0.15f && !isGrabbed)
+ #if UNITY_EDITOR
+ // 编辑器模式:鼠标左键模拟扳机
+ triggerPressed = triggerPressed || Input.GetMouseButton(0);
+ #endif
+
+ // 每次只能抓取一个碎片
+ if (triggerPressed && currentlyGrabbedMapFragment == null && !isGrabbed)
{
OnGrabbed(rightHand);
+ currentlyGrabbedMapFragment = this;
}
+
+ // 检测松手(扳机和鼠标左键都释放)
+ if (isGrabbed)
+ {
+ bool triggerReleased = !rightHand.isTrigger;
+
+ #if UNITY_EDITOR
+ triggerReleased = triggerReleased && !Input.GetMouseButton(0);
+ #endif
+
+ if (triggerReleased)
+ {
+ OnReleased();
+ }
+ }
+ }
+
+ #region 触发器检测
+
+ private void OnTriggerEnter(Collider other)
+ {
+ // 检测右手碰触
+ if (!isGrabbed && !isFlying)
+ {
+ RightHand rightHand = other.GetComponent();
+ if (rightHand != null)
+ {
+ rightHandInTrigger = true;
+ Debug.Log($"右手进入MapFragment {fragmentId} 触发器范围");
+ }
+ }
+ }
+
+ private void OnTriggerExit(Collider other)
+ {
+ // 右手离开触发器范围
+ if (!isGrabbed && !isFlying)
+ {
+ RightHand rightHand = other.GetComponent();
+ if (rightHand != null)
+ {
+ rightHandInTrigger = false;
+ Debug.Log($"右手离开MapFragment {fragmentId} 触发器范围");
+ }
+ }
+ }
+
+ #endregion
+
+ ///
+ /// 松手时清除全局抓取状态
+ ///
+ private void OnReleased()
+ {
+ if (currentlyGrabbedMapFragment == this)
+ {
+ currentlyGrabbedMapFragment = null;
+ }
+ isGrabbed = false;
+ Debug.Log($"拼图碎片 {fragmentId} 松手");
}
///
diff --git a/Assets/_Arcadia/Scripts/Item/PuzzleBowlArea.cs b/Assets/_Arcadia/Scripts/Item/PuzzleBowlArea.cs
index f52c55d4..3819820f 100644
--- a/Assets/_Arcadia/Scripts/Item/PuzzleBowlArea.cs
+++ b/Assets/_Arcadia/Scripts/Item/PuzzleBowlArea.cs
@@ -45,14 +45,9 @@ public class PuzzleBowlArea : MonoBehaviour
float x = Mathf.Cos(randomAngle * Mathf.Deg2Rad) * randomRadius;
float z = Mathf.Sin(randomAngle * Mathf.Deg2Rad) * randomRadius;
- // 计算堆叠高度(基于碎片数量)
- int layerIndex = fragmentsInBowl.Count / maxFragmentsPerLayer;
- float stackHeight = layerIndex * fragmentHeightOffset;
-
- // 限制最大堆叠高度
- stackHeight = Mathf.Min(stackHeight, maxStackHeight);
-
- Vector3 position = BowlCenterPosition + new Vector3(x, stackHeight + bowlHeight, z);
+ // 碎片生成在碗底中心高度,让物理引擎处理自然堆叠
+ // 不再手动计算堆叠高度,避免碎片悬浮在半空中
+ Vector3 position = BowlCenterPosition + new Vector3(x, 0.01f, z);
return position;
}
@@ -86,7 +81,6 @@ public class PuzzleBowlArea : MonoBehaviour
public void RemoveFragment(PuzzleFragment fragment)
{
if (fragment == null) return;
-
fragmentsInBowl.Remove(fragment);
Debug.Log($"碎片 {fragment.FragmentId} 从碗中移除,当前碗中碎片数: {fragmentsInBowl.Count}");
diff --git a/Assets/_Arcadia/Scripts/Item/PuzzleFragment.cs b/Assets/_Arcadia/Scripts/Item/PuzzleFragment.cs
index 3cc1ac13..8783947c 100644
--- a/Assets/_Arcadia/Scripts/Item/PuzzleFragment.cs
+++ b/Assets/_Arcadia/Scripts/Item/PuzzleFragment.cs
@@ -50,6 +50,16 @@ public class PuzzleFragment : MonoBehaviour
// 旋转角度选项
private readonly int[] rotationAngles = { 0, 90, 180, 270 };
+ // 全局静态变量:当前被抓取的PuzzleFragment(限制每次只能抓取一个)
+ private static PuzzleFragment currentlyGrabbedPuzzleFragment = null;
+
+ // 触发器检测:右手是否在碎片范围内
+ private bool rightHandInTrigger = false;
+
+ // 旋转冷却时间(防止连续触发)
+ private float lastRotateTime = 0f;
+ private float rotateCooldown = 0.5f;
+
public int FragmentId => fragmentId;
public int CorrectRotation => correctRotation;
public int CurrentRotation => currentRotation;
@@ -84,6 +94,71 @@ public class PuzzleFragment : MonoBehaviour
{
FollowHand();
}
+
+ // 检测右手交互(编辑器鼠标左键模拟抓取)
+ if (!isLocked && !isGrabbed)
+ {
+ CheckRightHandInteraction();
+ }
+
+ // 检测松手
+ if (isGrabbed)
+ {
+ CheckRelease();
+ }
+ }
+
+ ///
+ /// 检测右手交互(抓取检测)
+ /// 条件:触发器检测右手进入 + (扳机或鼠标左键) + 当前没有其他碎片被抓取
+ ///
+ private void CheckRightHandInteraction()
+ {
+ // 必须右手在触发器范围内
+ if (!rightHandInTrigger) return;
+
+ RightHand rightHand = GameManager.Ins?.playerRightHand;
+ if (rightHand == null) return;
+
+ // 检测扳机或鼠标左键
+ bool triggerPressed = rightHand.isTrigger;
+
+ #if UNITY_EDITOR
+ // 编辑器模式:鼠标左键模拟扳机
+ triggerPressed = triggerPressed || Input.GetMouseButton(0);
+ #endif
+
+ // 每次只能抓取一个碎片
+ if (triggerPressed && currentlyGrabbedPuzzleFragment == null)
+ {
+ OnGrabbed(rightHand.transform);
+ currentlyGrabbedPuzzleFragment = this;
+ }
+ }
+
+ ///
+ /// 检测松手(扳机和鼠标左键都释放)
+ ///
+ private void CheckRelease()
+ {
+ RightHand rightHand = GameManager.Ins?.playerRightHand;
+ if (rightHand == null) return;
+
+ bool triggerReleased = !rightHand.isTrigger;
+
+ #if UNITY_EDITOR
+ triggerReleased = triggerReleased && !Input.GetMouseButton(0);
+ #endif
+
+ if (triggerReleased)
+ {
+ // 清除全局抓取状态
+ if (currentlyGrabbedPuzzleFragment == this)
+ {
+ currentlyGrabbedPuzzleFragment = null;
+ }
+ OnReleased();
+ }
}
#region 抓取与放置
@@ -198,9 +273,11 @@ public class PuzzleFragment : MonoBehaviour
currentSlot = slot;
isInSlot = true;
- // 设置到卡槽位置
- transform.DOMove(slot.SlotPosition, 0.2f).SetEase(Ease.OutBack);
+ // 先设置父物体,再设置本地位置和本地旋转为零
transform.SetParent(slot.transform);
+ transform.DOLocalMove(Vector3.zero, 0.2f).SetEase(Ease.OutBack);
+ transform.DOLocalRotate(Vector3.zero, 0.2f).SetEase(Ease.OutBack);
+ currentRotation = 0;
// 禁用物理
if (rb != null)
@@ -519,33 +596,54 @@ public class PuzzleFragment : MonoBehaviour
private void OnTriggerEnter(Collider other)
{
- // 检测手柄碰触(用于旋转提示)
- if (isInSlot && !isLocked && !isGrabbed)
+ // 检测右手碰触
+ if (!isLocked && !isGrabbed)
{
RightHand rightHand = other.GetComponent();
if (rightHand != null)
{
- // 高亮提示可旋转
+ rightHandInTrigger = true;
+
+ // 高亮提示可抓取/可旋转
if (fragmentRenderer != null && highlightMaterial != null)
{
fragmentRenderer.material = highlightMaterial;
}
+
+ // 如果碎片在卡槽中且未锁定,右手碰到就旋转
+ if (isInSlot && !isLocked)
+ {
+ // 检查冷却时间,防止连续快速旋转
+ if (Time.time - lastRotateTime >= rotateCooldown)
+ {
+ lastRotateTime = Time.time;
+ Rotate90();
+ Debug.Log($"右手碰触卡槽中的碎片 {fragmentId},自动旋转");
+ }
+ }
+
+ Debug.Log($"右手进入碎片 {fragmentId} 触发器范围");
}
}
}
private void OnTriggerExit(Collider other)
{
- // 恢复材质
- if (isInSlot && !isLocked && !isGrabbed)
+ // 右手离开触发器范围
+ if (!isLocked && !isGrabbed)
{
RightHand rightHand = other.GetComponent();
if (rightHand != null)
{
+ rightHandInTrigger = false;
+
+ // 恢复正常材质
if (fragmentRenderer != null && normalMaterial != null)
{
fragmentRenderer.material = normalMaterial;
}
+
+ Debug.Log($"右手离开碎片 {fragmentId} 触发器范围");
}
}
}