From 552955f3d4e455832a5f3fba104d26e25bb2d77e Mon Sep 17 00:00:00 2001
From: bottlefish <781230111@qq.com>
Date: Thu, 8 May 2025 16:17:49 +0800
Subject: [PATCH] =?UTF-8?q?=20=E4=B8=AD=E9=97=B4=E7=89=88=E6=9C=AC?=
=?UTF-8?q?=E5=AD=98=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Assets/AddressableAssetsData/link.xml | 415 --------------
.../PlayMaker - Integration.unitypackage.meta | 7 -
... Scripting - Integration.unitypackage.meta | 7 -
Assets/Prefabs/Huoshan/LakeLineDrawer.prefab | 145 +++++
.../Huoshan/LakeLineDrawer.prefab.meta} | 4 +-
Assets/Scenes/HuoShanEmoSceneTest.unity | 514 +++++++++++++-----
.../MiniGame/HuoShan/Emo/GridGenerator.cs | 59 ++
.../HuoShan/Emo/GridGenerator.cs.meta | 11 +
.../MiniGame/HuoShan/Emo/LakeLineDrawer.cs | 383 +++++++++++--
.../MiniGame/HuoShan/Emo/LakeUIController.cs | 29 +
.../HuoShan/Emo/LakeUIController.cs.meta | 11 +
.../MiniGame/HuoShan/Emo/LakeVisualizer.cs | 195 +++++++
.../HuoShan/Emo/LakeVisualizer.cs.meta | 11 +
.../MiniGame/HuoShan/Emo/RippleManager.cs | 79 +++
.../HuoShan/Emo/RippleManager.cs.meta | 11 +
.../HuoShan/Emo/TargetPointManager.cs | 112 ++++
.../HuoShan/Emo/TargetPointManager.cs.meta | 11 +
.../MiniGame/HuoShan/Emo/WaveGenerator.cs | 21 +
.../HuoShan/Emo/WaveGenerator.cs.meta | 11 +
19 files changed, 1401 insertions(+), 635 deletions(-)
delete mode 100644 Assets/AddressableAssetsData/link.xml
delete mode 100644 Assets/Plugins/Febucci/Text Animator/Integrations/PlayMaker - Integration.unitypackage.meta
delete mode 100644 Assets/Plugins/Febucci/Text Animator/Integrations/Visual Scripting - Integration.unitypackage.meta
create mode 100644 Assets/Prefabs/Huoshan/LakeLineDrawer.prefab
rename Assets/{Plugins/Febucci/Text Animator/Extra/Typewriter Sound - Package.unitypackage.meta => Prefabs/Huoshan/LakeLineDrawer.prefab.meta} (63%)
create mode 100644 Assets/Scripts/MiniGame/HuoShan/Emo/GridGenerator.cs
create mode 100644 Assets/Scripts/MiniGame/HuoShan/Emo/GridGenerator.cs.meta
create mode 100644 Assets/Scripts/MiniGame/HuoShan/Emo/LakeUIController.cs
create mode 100644 Assets/Scripts/MiniGame/HuoShan/Emo/LakeUIController.cs.meta
create mode 100644 Assets/Scripts/MiniGame/HuoShan/Emo/LakeVisualizer.cs
create mode 100644 Assets/Scripts/MiniGame/HuoShan/Emo/LakeVisualizer.cs.meta
create mode 100644 Assets/Scripts/MiniGame/HuoShan/Emo/RippleManager.cs
create mode 100644 Assets/Scripts/MiniGame/HuoShan/Emo/RippleManager.cs.meta
create mode 100644 Assets/Scripts/MiniGame/HuoShan/Emo/TargetPointManager.cs
create mode 100644 Assets/Scripts/MiniGame/HuoShan/Emo/TargetPointManager.cs.meta
create mode 100644 Assets/Scripts/MiniGame/HuoShan/Emo/WaveGenerator.cs
create mode 100644 Assets/Scripts/MiniGame/HuoShan/Emo/WaveGenerator.cs.meta
diff --git a/Assets/AddressableAssetsData/link.xml b/Assets/AddressableAssetsData/link.xml
deleted file mode 100644
index f8726f7df..000000000
--- a/Assets/AddressableAssetsData/link.xml
+++ /dev/null
@@ -1,415 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Assets/Plugins/Febucci/Text Animator/Integrations/PlayMaker - Integration.unitypackage.meta b/Assets/Plugins/Febucci/Text Animator/Integrations/PlayMaker - Integration.unitypackage.meta
deleted file mode 100644
index 77d64a86c..000000000
--- a/Assets/Plugins/Febucci/Text Animator/Integrations/PlayMaker - Integration.unitypackage.meta
+++ /dev/null
@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: fb01be13d6e88ca488dda82150319bfc
-DefaultImporter:
- externalObjects: {}
- userData:
- assetBundleName:
- assetBundleVariant:
diff --git a/Assets/Plugins/Febucci/Text Animator/Integrations/Visual Scripting - Integration.unitypackage.meta b/Assets/Plugins/Febucci/Text Animator/Integrations/Visual Scripting - Integration.unitypackage.meta
deleted file mode 100644
index 05e590027..000000000
--- a/Assets/Plugins/Febucci/Text Animator/Integrations/Visual Scripting - Integration.unitypackage.meta
+++ /dev/null
@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 117dcc671050f5247bd8743b91ecaab7
-DefaultImporter:
- externalObjects: {}
- userData:
- assetBundleName:
- assetBundleVariant:
diff --git a/Assets/Prefabs/Huoshan/LakeLineDrawer.prefab b/Assets/Prefabs/Huoshan/LakeLineDrawer.prefab
new file mode 100644
index 000000000..300edcb6d
--- /dev/null
+++ b/Assets/Prefabs/Huoshan/LakeLineDrawer.prefab
@@ -0,0 +1,145 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &9153305584215853973
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3464828912861393548}
+ - component: {fileID: 2975997353605660364}
+ - component: {fileID: 5079919382093048530}
+ - component: {fileID: 4479607651016873723}
+ - component: {fileID: 1064932125706210448}
+ m_Layer: 0
+ m_Name: LakeLineDrawer
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &3464828912861393548
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9153305584215853973}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0.01, y: 0.52, z: -0.05}
+ 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!65 &2975997353605660364
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9153305584215853973}
+ m_Material: {fileID: 0}
+ m_IncludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_ExcludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_LayerOverridePriority: 0
+ m_IsTrigger: 0
+ m_ProvidesContacts: 0
+ m_Enabled: 1
+ serializedVersion: 3
+ m_Size: {x: 7.82, y: 1, z: 7.13}
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!64 &5079919382093048530
+MeshCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9153305584215853973}
+ m_Material: {fileID: 0}
+ m_IncludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_ExcludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_LayerOverridePriority: 0
+ m_IsTrigger: 0
+ m_ProvidesContacts: 0
+ m_Enabled: 0
+ serializedVersion: 5
+ m_Convex: 0
+ m_CookingOptions: 30
+ m_Mesh: {fileID: 0}
+--- !u!114 &4479607651016873723
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9153305584215853973}
+ m_Enabled: 0
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f4f1d20068959374280197d2f664e3b9, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ useCullingMasks: 0
+ fieldSize: 6.75
+ pointCount: 30
+ pointSize: 0.05
+ lineWidth: 0.01
+ noiseScale: 0.3
+ waveHeight: 1
+ waveSpeed: 0.2
+ timeScale: 1
+ rippleStrength: 2
+ rippleDuration: 1.5
+ rippleSpreadSpeed: 6
+ rippleSharpness: 2
+ rippleDelay: 0
+ playerPos: {x: 10, y: 7}
+ moveCooldown: 0.5
+ playerBounceHeight: 1.5
+ obstacles:
+ - {x: 17, y: 18}
+ - {x: 7, y: 13}
+ - {x: 16, y: 12}
+ - {x: 18, y: 12}
+ - {x: 20, y: 12}
+ - {x: 12, y: 4}
+ - {x: 23, y: 4}
+ - {x: 18, y: 4}
+ - {x: 25, y: 21}
+ - {x: 7, y: 21}
+--- !u!114 &1064932125706210448
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9153305584215853973}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 70bdc08d6a69fcc489e789073881b5c5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ useCullingMasks: 0
+ fieldSize: 6.75
+ pointCount: 30
+ pointSize: 0.05
+ lineWidth: 0.01
+ noiseScale: 0.3
+ waveHeight: 1
+ waveSpeed: 0.2
+ timeScale: 1
+ rippleStrength: 2
+ rippleDuration: 1.5
+ rippleSpreadSpeed: 6
+ rippleSharpness: 2
diff --git a/Assets/Plugins/Febucci/Text Animator/Extra/Typewriter Sound - Package.unitypackage.meta b/Assets/Prefabs/Huoshan/LakeLineDrawer.prefab.meta
similarity index 63%
rename from Assets/Plugins/Febucci/Text Animator/Extra/Typewriter Sound - Package.unitypackage.meta
rename to Assets/Prefabs/Huoshan/LakeLineDrawer.prefab.meta
index 4801b3793..631d388fb 100644
--- a/Assets/Plugins/Febucci/Text Animator/Extra/Typewriter Sound - Package.unitypackage.meta
+++ b/Assets/Prefabs/Huoshan/LakeLineDrawer.prefab.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
-guid: 560a88da2bbc70140bed167f0ba7fe37
-DefaultImporter:
+guid: 67658af7714634d45a2aa8f958ea21fd
+PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
diff --git a/Assets/Scenes/HuoShanEmoSceneTest.unity b/Assets/Scenes/HuoShanEmoSceneTest.unity
index 132a61b9a..fffb8fe43 100644
--- a/Assets/Scenes/HuoShanEmoSceneTest.unity
+++ b/Assets/Scenes/HuoShanEmoSceneTest.unity
@@ -123,149 +123,6 @@ NavMeshSettings:
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
---- !u!1 &472731661
-GameObject:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- serializedVersion: 6
- m_Component:
- - component: {fileID: 472731664}
- - component: {fileID: 472731665}
- - component: {fileID: 472731666}
- - component: {fileID: 472731667}
- - component: {fileID: 472731668}
- m_Layer: 0
- m_Name: LakeLineDrawer
- m_TagString: Untagged
- m_Icon: {fileID: 0}
- m_NavMeshLayer: 0
- m_StaticEditorFlags: 0
- m_IsActive: 1
---- !u!4 &472731664
-Transform:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 472731661}
- serializedVersion: 2
- m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
- m_LocalPosition: {x: 0.01, y: 0.52, z: -0.05}
- 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!65 &472731665
-BoxCollider:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 472731661}
- m_Material: {fileID: 0}
- m_IncludeLayers:
- serializedVersion: 2
- m_Bits: 0
- m_ExcludeLayers:
- serializedVersion: 2
- m_Bits: 0
- m_LayerOverridePriority: 0
- m_IsTrigger: 0
- m_ProvidesContacts: 0
- m_Enabled: 1
- serializedVersion: 3
- m_Size: {x: 7.82, y: 1, z: 7.13}
- m_Center: {x: 0, y: 0, z: 0}
---- !u!64 &472731666
-MeshCollider:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 472731661}
- m_Material: {fileID: 0}
- m_IncludeLayers:
- serializedVersion: 2
- m_Bits: 0
- m_ExcludeLayers:
- serializedVersion: 2
- m_Bits: 0
- m_LayerOverridePriority: 0
- m_IsTrigger: 0
- m_ProvidesContacts: 0
- m_Enabled: 0
- serializedVersion: 5
- m_Convex: 0
- m_CookingOptions: 30
- m_Mesh: {fileID: 0}
---- !u!114 &472731667
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 472731661}
- m_Enabled: 0
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: f4f1d20068959374280197d2f664e3b9, type: 3}
- m_Name:
- m_EditorClassIdentifier:
- useCullingMasks: 0
- fieldSize: 6.75
- pointCount: 30
- pointSize: 0.05
- lineWidth: 0.01
- noiseScale: 0.3
- waveHeight: 1
- waveSpeed: 0.2
- timeScale: 1
- rippleStrength: 2
- rippleDuration: 1.5
- rippleSpreadSpeed: 6
- rippleSharpness: 2
- rippleDelay: 0
- playerPos: {x: 10, y: 7}
- moveCooldown: 0.5
- playerBounceHeight: 1.5
- obstacles:
- - {x: 17, y: 18}
- - {x: 7, y: 13}
- - {x: 16, y: 12}
- - {x: 18, y: 12}
- - {x: 20, y: 12}
- - {x: 12, y: 4}
- - {x: 23, y: 4}
- - {x: 18, y: 4}
- - {x: 25, y: 21}
- - {x: 7, y: 21}
---- !u!114 &472731668
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 472731661}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 70bdc08d6a69fcc489e789073881b5c5, type: 3}
- m_Name:
- m_EditorClassIdentifier:
- useCullingMasks: 0
- fieldSize: 6.75
- pointCount: 30
- pointSize: 0.05
- lineWidth: 0.01
- noiseScale: 0.3
- waveHeight: 1
- waveSpeed: 0.2
- timeScale: 1
- rippleStrength: 2
- rippleDuration: 1.5
- rippleSpreadSpeed: 6
- rippleSharpness: 2
--- !u!1 &519420028
GameObject:
m_ObjectHideFlags: 0
@@ -397,13 +254,13 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 519420028}
serializedVersion: 2
- m_LocalRotation: {x: 0.3970472, y: -0.006888179, z: 0.0029810548, w: 0.9177675}
+ m_LocalRotation: {x: 0.4045762, y: -0.0068634483, z: 0.003037563, w: 0.91447353}
m_LocalPosition: {x: 0.019188061, y: 7.2175875, z: -6.8352437}
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}
+ m_LocalEulerAnglesHint: {x: 47.731, y: -0.86, z: 0}
--- !u!114 &519420033
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -420,9 +277,374 @@ MonoBehaviour:
serializedVersion: 2
m_Bits: 4294967295
m_MaxRayIntersections: 0
+--- !u!65 &507652625753095997
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5854754705337305700}
+ m_Material: {fileID: 0}
+ m_IncludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_ExcludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_LayerOverridePriority: 0
+ m_IsTrigger: 0
+ m_ProvidesContacts: 0
+ m_Enabled: 1
+ serializedVersion: 3
+ m_Size: {x: 7.82, y: 1, z: 7.13}
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!4 &2185051783577957245
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5854754705337305700}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0.01, y: 0.52, z: -0.05}
+ 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!1001 &4077561020806840184
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 0}
+ m_Modifications:
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: maskSize
+ value: 48.9
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: fieldSize
+ value: 20
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: lineWidth
+ value: 0.01
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: m_Enabled
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: pointSize
+ value: 0.06
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: waveSpeed
+ value: 0.14
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: noiseScale
+ value: 0.6
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: pointCount
+ value: 56
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: targetSize
+ value: 0.32
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: waveHeight
+ value: 0.64
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: goalPoint.x
+ value: 18.59
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: goalPoint.y
+ value: 6.14
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: maskOffset.x
+ value: -6.6000004
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: maskOffset.y
+ value: -6.6000004
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: waterColor.b
+ value: 0.8679245
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: waterColor.g
+ value: 0.43422773
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: waterColor.r
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: rippleColor.b
+ value: 0.2980392
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: rippleColor.g
+ value: 0.32098562
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: viewFieldSize
+ value: 5.51
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: edgeLineLength
+ value: 1.86
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: totalFieldSize
+ value: 35.7
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: edgeDarkColor.b
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: edgeDarkColor.g
+ value: 0.52284783
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: edgeDarkColor.r
+ value: 0.0603773
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: targetLineWidth
+ value: 0.02
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: totalPointCount
+ value: 39
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: visibleAreaSize
+ value: 26.62
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: targetPoints.Array.size
+ value: 2
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: targetPoints.Array.data[0].type
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: targetPoints.Array.data[0].color.a
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: targetPoints.Array.data[0].color.b
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: targetPoints.Array.data[0].color.g
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: targetPoints.Array.data[0].color.r
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: targetPoints.Array.data[0].position.x
+ value: 3.3
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: targetPoints.Array.data[0].position.y
+ value: 16.36
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: targetPoints.Array.data[0].gridPosition.x
+ value: 10.75
+ objectReference: {fileID: 0}
+ - target: {fileID: 1064932125706210448, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: targetPoints.Array.data[0].gridPosition.y
+ value: 19.83
+ objectReference: {fileID: 0}
+ - target: {fileID: 2975997353605660364, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: m_Size.x
+ value: 11.684589
+ objectReference: {fileID: 0}
+ - target: {fileID: 2975997353605660364, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: m_Size.z
+ value: 9.818142
+ objectReference: {fileID: 0}
+ - target: {fileID: 2975997353605660364, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: m_Center.x
+ value: -0.14138317
+ objectReference: {fileID: 0}
+ - target: {fileID: 2975997353605660364, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: m_Center.z
+ value: -0.063780785
+ objectReference: {fileID: 0}
+ - target: {fileID: 3464828912861393548, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3464828912861393548, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3464828912861393548, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3464828912861393548, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 3464828912861393548, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3464828912861393548, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3464828912861393548, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3464828912861393548, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3464828912861393548, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3464828912861393548, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 9153305584215853973, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: m_Name
+ value: LakeLineDrawer
+ objectReference: {fileID: 0}
+ - target: {fileID: 9153305584215853973, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+ propertyPath: m_IsActive
+ value: 1
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: 67658af7714634d45a2aa8f958ea21fd, type: 3}
+--- !u!1 &5854754705337305700
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2185051783577957245}
+ - component: {fileID: 507652625753095997}
+ - component: {fileID: 7509797800874568483}
+ - component: {fileID: 7509797800874568484}
+ - component: {fileID: 7509797800874568485}
+ m_Layer: 0
+ m_Name: LakeLineDrawer (1)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 0
+--- !u!64 &7509797800874568483
+MeshCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5854754705337305700}
+ m_Material: {fileID: 0}
+ m_IncludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_ExcludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_LayerOverridePriority: 0
+ m_IsTrigger: 0
+ m_ProvidesContacts: 0
+ m_Enabled: 0
+ serializedVersion: 5
+ m_Convex: 0
+ m_CookingOptions: 30
+ m_Mesh: {fileID: 0}
+--- !u!114 &7509797800874568484
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5854754705337305700}
+ m_Enabled: 0
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 874c4686e7644b74f83e1c0a58b26b34, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ useCullingMasks: 0
+ fieldSize: 6.5
+ pointCount: 30
+ pointSize: 0.05
+ lineWidth: 0.01
+ noiseScale: 0.3
+ waveHeight: 1.5
+ waveSpeed: 1
+ timeScale: 1
+ rippleStrength: 2
+ rippleDuration: 1.5
+ rippleSpreadSpeed: 6
+ rippleSharpness: 2
+ targetPosition: {x: 1.66, y: 5.54}
+ shapeChangeRadius: 4
+--- !u!114 &7509797800874568485
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5854754705337305700}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f4f1d20068959374280197d2f664e3b9, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ useCullingMasks: 0
+ fieldSize: 20
+ pointCount: 30
+ pointSize: 0.15
+ lineWidth: 0.03
+ noiseScale: 0.3
+ waveHeight: 1.5
+ waveSpeed: 1
+ timeScale: 1
+ rippleStrength: 2
+ rippleDuration: 1.5
+ rippleSpreadSpeed: 6
+ rippleSharpness: 2
+ rippleDelay: 0.25
+ playerPos: {x: 1, y: 1}
+ moveCooldown: 0.2
+ playerBounceHeight: 1.5
+ obstacles: []
--- !u!1660057539 &9223372036854775807
SceneRoots:
m_ObjectHideFlags: 0
m_Roots:
- {fileID: 519420032}
- - {fileID: 472731664}
+ - {fileID: 4077561020806840184}
+ - {fileID: 2185051783577957245}
diff --git a/Assets/Scripts/MiniGame/HuoShan/Emo/GridGenerator.cs b/Assets/Scripts/MiniGame/HuoShan/Emo/GridGenerator.cs
new file mode 100644
index 000000000..e57fb8780
--- /dev/null
+++ b/Assets/Scripts/MiniGame/HuoShan/Emo/GridGenerator.cs
@@ -0,0 +1,59 @@
+using UnityEngine;
+using System.Collections.Generic;
+using Shapes;
+
+public class GridGenerator
+{
+ private float fieldSize;
+ private int pointCount;
+ private float pointSize;
+ private float lineWidth;
+ private float edgeLineLength;
+
+ public GridGenerator(float fieldSize, int pointCount, float pointSize, float lineWidth, float edgeLineLength)
+ {
+ this.fieldSize = fieldSize;
+ this.pointCount = pointCount;
+ this.pointSize = pointSize;
+ this.lineWidth = lineWidth;
+ this.edgeLineLength = edgeLineLength;
+ }
+
+ public List GenerateGridPoints()
+ {
+ List points = new List();
+ float step = fieldSize / (pointCount - 1);
+ float halfSize = fieldSize / 2f;
+
+ for (int i = 0; i < pointCount; i++)
+ {
+ for (int j = 0; j < pointCount; j++)
+ {
+ float x = j * step - halfSize;
+ float z = i * step - halfSize;
+ points.Add(new Vector3(x, 0f, z));
+ }
+ }
+
+ return points;
+ }
+
+ public void DrawGridPoint(Vector3 position, float size, Color color)
+ {
+ Draw.Sphere(position, size, color);
+ }
+
+ public void DrawGridLine(Vector3 start, Vector3 end, float width, Color color)
+ {
+ Draw.Line(start, end, width, color);
+ }
+
+ public void DrawEdgeLine(Vector3 start, Vector3 end, float width, Color color)
+ {
+ Vector3 direction = (end - start).normalized;
+ Vector3 normal = Vector3.Cross(direction, Vector3.up).normalized;
+ Vector3 offset = normal * edgeLineLength;
+
+ Draw.Line(start + offset, end + offset, width, color);
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/MiniGame/HuoShan/Emo/GridGenerator.cs.meta b/Assets/Scripts/MiniGame/HuoShan/Emo/GridGenerator.cs.meta
new file mode 100644
index 000000000..dc74f53b5
--- /dev/null
+++ b/Assets/Scripts/MiniGame/HuoShan/Emo/GridGenerator.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 98172966e69290c4d9bd44ac3ee8b2d1
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MiniGame/HuoShan/Emo/LakeLineDrawer.cs b/Assets/Scripts/MiniGame/HuoShan/Emo/LakeLineDrawer.cs
index 4a48151fa..a7b354267 100644
--- a/Assets/Scripts/MiniGame/HuoShan/Emo/LakeLineDrawer.cs
+++ b/Assets/Scripts/MiniGame/HuoShan/Emo/LakeLineDrawer.cs
@@ -1,30 +1,77 @@
using UnityEngine;
using Shapes;
using System.Collections.Generic;
+using UnityEngine.UI;
[ExecuteAlways]
public class LakeLineDrawer : ImmediateModeShapeDrawer
{
[Header("场设置")]
- public float fieldSize = 20f;
- public int pointCount = 30;
- public float pointSize = 0.15f;
+ public float fieldSize = 80f;
+ public Vector2 fieldOffset = Vector2.zero;
+ public int pointCount = 80;
+ public float pointSize = 0.1f;
public float lineWidth = 0.03f;
- [Header("波动参数")]
+ [Header("颜色设置")]
+ public Color lakeDarkColor = new Color(0f, 0.5f, 1f); // 湖面低处颜色
+ public Color lakeLightColor = new Color(0.5f, 1f, 1f, 0.3f); // 湖面高处颜色
+ public Color edgeDarkColor = new Color(0f, 0.5f, 1f); // 边缘低处颜色
+ public Color edgeLightColor = new Color(0.5f, 1f, 1f, 0.3f); // 边缘高处颜色
+ public float edgeLineLength = 1f; // 边缘线的长度
+
+ [Header("UI控制")]
+ public Slider xOffsetSlider;
+ public Slider zOffsetSlider;
+ public float maxOffset = 20f;
+
+ [Header("目标点设置")]
+ public List targetPoints = new List();
+ public float targetSize = 0.5f;
+ public float rotationSpeed = 30f; // 旋转速度(度/秒)
+ public float floatAmplitude = 0.2f; // 起伏幅度
+ public float floatFrequency = 2f; // 起伏频率
+ public float targetLineWidth = 0.02f; // 目标点线框的宽度
+ public float targetHeightOffset = 0.5f; // 目标点距离湖面的高度偏移
+ public Color targetFillColor = Color.red; // 目标点实体颜色
+ public Color targetWireColor = Color.white; // 目标点线框颜色
+ public float wireScale = 1.05f; // 线框相对于实体的大小比例
+
+ [Header("可视区域")]
+ public float visibleAreaSize = 20f;
+
+ // 波动参数,用于生成波动效果
public float noiseScale = 0.3f;
public float waveHeight = 1.5f;
public float waveSpeed = 1f;
public float timeScale = 1f;
-
[Header("涟漪参数")]
- public float rippleStrength = 2f; // 尖刺强度
- public float rippleDuration = 1.5f; // 持续时间
- public float rippleSpreadSpeed = 6f; // 扩散速度
- public float rippleSharpness = 2f; // 尖刺锐度
+ public float rippleStrength = 2f; // 恢复原来的强度
+ public float rippleDuration = 0.8f; // 适中的持续时间
+ public float rippleSpreadSpeed = 4f; // 适中的传播速度
+ public float rippleSharpness = 4f; // 适中的锐度
+ public float rippleMaxRadius = 3f; // 新增:涟漪最大半径
private Vector3[] points;
+ // 存储每个点是否在可视区域内的标记
+ private bool[] validPoints;
private float time;
+ private List ripples = new List();
+
+ [System.Serializable]
+ public class TargetPoint
+ {
+ public Vector2 gridPosition; // 网格位置(0到pointCount-1)
+ public TargetType type;
+ public Color color = Color.white;
+ }
+
+ public enum TargetType
+ {
+ Sphere,
+ Cube,
+ Torus
+ }
private struct Ripple
{
@@ -38,18 +85,38 @@ public class LakeLineDrawer : ImmediateModeShapeDrawer
public float brightnessBoost;
}
- private List ripples = new List();
-
private void Update()
{
+ // 如果是播放状态,则更新时间;否则设为0
time = Application.isPlaying ? Time.time * timeScale : 0f;
+ HandleMouseInput();
+ HandleUIInput();
+ CleanExpiredRipples();
+ }
+
+ private void HandleUIInput()
+ {
+ if (xOffsetSlider != null && zOffsetSlider != null)
+ {
+ fieldOffset = new Vector2(
+ xOffsetSlider.value * maxOffset,
+ zOffsetSlider.value * maxOffset
+ );
+ }
+ }
+
+ // 处理鼠标点击,触发新的涟漪
+ private void HandleMouseInput()
+ {
if (Application.isPlaying && Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
+
if (Physics.Raycast(ray, out RaycastHit hit))
{
Vector3 hitPos = hit.point;
+
ripples.Add(new Ripple
{
position = new Vector2(hitPos.x, hitPos.z),
@@ -57,57 +124,74 @@ public class LakeLineDrawer : ImmediateModeShapeDrawer
});
}
}
+ }
+ private void CleanExpiredRipples()
+ {
ripples.RemoveAll(r => Time.time - r.startTime > rippleDuration);
}
+ // 计算涟漪对某个点的影响,返回该点的偏移量和亮度提升
private RippleResult GetRippleEffect(float x, float z, float currentTime)
{
float rippleOffset = 0f;
float brightness = 0f;
+ // 遍历所有涟漪,计算它们对当前点的影响
foreach (var ripple in ripples)
{
+ // 计算涟漪已经存在的时间
float elapsed = currentTime - ripple.startTime;
- float spread = elapsed * rippleSpreadSpeed;
- float dist = Vector2.Distance(new Vector2(x, z), ripple.position);
+ float spread = elapsed * rippleSpreadSpeed; // 涟漪扩展的距离
+ float dist = Vector2.Distance(new Vector2(x, z), ripple.position); // 当前点与涟漪中心的距离
+ // 如果距离超过最大半径,跳过这个涟漪的影响
+ if (dist > rippleMaxRadius)
+ continue;
+
+ // 计算涟漪的时间影响,t表示涟漪的衰减程度
float t = Mathf.Clamp01(elapsed / rippleDuration);
- float ease = Mathf.Sin(t * Mathf.PI);
+ float ease = Mathf.Sin(t * Mathf.PI); // 使用正弦函数使衰减效果平滑
+ // 计算涟漪对当前点的高度影响
float spike = Mathf.Exp(-Mathf.Pow(dist - spread, 2f) * rippleSharpness);
rippleOffset += spike * rippleStrength * ease;
+ // 计算涟漪对当前点的亮度提升
float bright = Mathf.Exp(-Mathf.Pow((dist - spread) * 0.5f, 2f));
brightness += bright * ease;
}
return new RippleResult
{
- heightOffset = rippleOffset,
- brightnessBoost = brightness
+ heightOffset = rippleOffset, // 高度偏移
+ brightnessBoost = brightness // 亮度提升
};
}
+ // 计算某个点的基础高度,基于噪声函数模拟波浪
private float GetHeight(float x, float z, float currentTime)
{
float noise = 0;
float amp = 1f;
float freq = 1f;
+ // 生成多个频率的噪声,模拟更复杂的波动
for (int i = 0; i < 3; i++)
{
+ // 基于当前时间和位置生成噪声值
float nx = x * freq * noiseScale;
float nz = z * freq * noiseScale;
float nt = currentTime * waveSpeed * freq;
- noise += Mathf.PerlinNoise(nx + nt, nz + nt) * amp;
- amp *= 0.5f;
- freq *= 2f;
+ noise += Mathf.PerlinNoise(nx + nt, nz + nt) * amp; // 累加噪声
+ amp *= 0.5f; // 每次衰减幅度
+ freq *= 2f; // 每次增加频率
}
return noise * waveHeight;
}
+ // 绘制湖面
public override void DrawShapes(Camera cam)
{
using (Draw.Command(cam))
@@ -117,63 +201,246 @@ public class LakeLineDrawer : ImmediateModeShapeDrawer
Draw.Thickness = lineWidth;
float step = fieldSize / (pointCount - 1);
- float halfSize = fieldSize * 0.5f;
+ float halfField = fieldSize * 0.5f;
+ float halfVisible = visibleAreaSize * 0.5f;
if (points == null || points.Length != pointCount * pointCount)
points = new Vector3[pointCount * pointCount];
+ if (validPoints == null || validPoints.Length != pointCount * pointCount)
+ validPoints = new bool[pointCount * pointCount];
- for (int i = 0; i < pointCount; i++)
+ CalculatePointPositions(step, halfField, halfVisible);
+ DrawPointsAndLines(step, halfField, halfVisible);
+ DrawEdgeLines(halfField, halfVisible);
+ DrawTargetPoints(); // 添加目标点的绘制
+ }
+ }
+
+ // 计算每个点的位置和涟漪效果
+ private void CalculatePointPositions(float step, float halfField, float halfVisible)
+ {
+ // 遍历每个点,计算其位置和涟漪影响
+ for (int i = 0; i < pointCount; i++)
+ {
+ for (int j = 0; j < pointCount; j++)
{
- for (int j = 0; j < pointCount; j++)
- {
- float x = -halfSize + j * step;
- float z = -halfSize + i * step;
+ // 计算当前点的位置(x,z)
+ float x = -halfField + j * step + fieldOffset.x;
+ float z = -halfField + i * step + fieldOffset.y;
- float baseHeight = GetHeight(x, z, time);
- RippleResult ripple = GetRippleEffect(x, z, Time.time);
- float finalY = baseHeight + ripple.heightOffset;
+ // 判断该点是否在可视区域内
+ bool inside = Mathf.Abs(x) <= halfVisible && Mathf.Abs(z) <= halfVisible;
+ int index = i * pointCount + j; // 计算当前点的索引
+ validPoints[index] = inside; // 设置该点是否有效
- Vector3 pos = new Vector3(x, finalY, z);
+ if (!inside)
+ continue;
- points[i * pointCount + j] = pos;
+ // 获取基础波浪高度,并计算涟漪影响
+ float baseHeight = GetHeight(x, z, time);
+ RippleResult ripple = GetRippleEffect(x, z, Time.time);
+ float finalY = baseHeight + ripple.heightOffset;
- float depth = (finalY + waveHeight) / (waveHeight * 2f);
- float brightness = Mathf.Clamp01(1f + ripple.brightnessBoost);
- float pointScale = pointSize * (1f - depth * 0.5f);
+ // 创建点的坐标
+ Vector3 pos = new Vector3(x, finalY, z);
+ points[index] = pos; // 存储计算得到的点
- Color baseColor = Color.Lerp(new Color(0.5f, 1f, 1f), new Color(0f, 0.5f, 1f), depth);
- baseColor *= brightness;
+ // 计算亮度:基于高度,越高越亮
+ float heightT = Mathf.InverseLerp(-waveHeight, waveHeight, finalY);
+ float brightness = Mathf.Clamp01(1f + ripple.brightnessBoost); // 计算亮度,防止超出范围
+ Color baseColor = Color.Lerp(lakeDarkColor, lakeLightColor, heightT);
+ baseColor *= brightness;
- Draw.Sphere(pos, pointScale, baseColor);
- }
+ // 绘制当前点
+ Draw.Sphere(pos, pointSize * (1f - heightT * 0.5f), baseColor);
}
+ }
+ }
- for (int i = 0; i < pointCount; i++)
+ // 绘制点与点之间的连线
+ private void DrawPointsAndLines(float step, float halfField, float halfVisible)
+ {
+ for (int i = 0; i < pointCount; i++)
+ {
+ for (int j = 0; j < pointCount; j++)
{
- for (int j = 0; j < pointCount; j++)
+ int index = i * pointCount + j;
+ if (!validPoints[index])
+ continue;
+
+ Vector3 current = points[index];
+
+ if (j < pointCount - 1 && validPoints[index + 1])
{
- int index = i * pointCount + j;
- Vector3 current = points[index];
+ Vector3 next = points[index + 1];
+ DrawLineBetweenPoints(current, next, halfField, halfVisible);
+ }
- if (j < pointCount - 1)
- {
- Vector3 next = points[index + 1];
- float avgY = (current.y + next.y) * 0.5f;
- float lineDepth = (avgY + waveHeight) / (waveHeight * 2f);
- Color lineColor = Color.Lerp(Color.cyan, new Color(0, 0.5f, 1f, 0.3f), lineDepth);
- Draw.Line(current, next, lineWidth * (1f - lineDepth * 0.5f), lineColor);
- }
-
- if (i < pointCount - 1)
- {
- Vector3 next = points[index + pointCount];
- float avgY = (current.y + next.y) * 0.5f;
- float lineDepth = (avgY + waveHeight) / (waveHeight * 2f);
- Color lineColor = Color.Lerp(Color.cyan, new Color(0, 0.5f, 1f, 0.3f), lineDepth);
- Draw.Line(current, next, lineWidth * (1f - lineDepth * 0.5f), lineColor);
- }
+ // 绘制与下边点的连线
+ if (i < pointCount - 1 && validPoints[index + pointCount])
+ {
+ Vector3 next = points[index + pointCount];
+ DrawLineBetweenPoints(current, next, halfField, halfVisible);
}
}
}
}
+
+ // 绘制两点之间的连线,加入深度和颜色的渐变
+ private void DrawLineBetweenPoints(Vector3 current, Vector3 next, float halfField, float halfVisible)
+ {
+ // 计算连线的平均高度
+ float avgY = (current.y + next.y) * 0.5f;
+ float heightT = Mathf.InverseLerp(-waveHeight, waveHeight, avgY);
+
+ // 计算连线的颜色,依赖于高度
+ Color lineColor = Color.Lerp(lakeDarkColor, lakeLightColor, heightT);
+ lineColor.a *= 0.8f; // 设置透明度
+
+ // 绘制连线
+ Draw.Line(current, next, lineWidth * (1f - heightT * 0.5f), lineColor);
+ }
+
+ private void DrawEdgeLine(float x, float z, float halfVisible)
+ {
+ // 检查点是否在可视区域内
+ if (Mathf.Abs(x) > halfVisible || Mathf.Abs(z) > halfVisible)
+ {
+ return;
+ }
+
+ // 计算湖面高度作为起始点的Y坐标
+ float startY = GetHeight(x, z, time); // 获取湖面高度
+
+ // 设置边缘线的起始点
+ Vector3 start = new Vector3(x, startY, z);
+
+ // 设置边缘线的终止点,向下延伸一定的长度
+ Vector3 end = new Vector3(x, startY - edgeLineLength, z); // 向下延伸的线条
+
+ // 设置颜色,基于高度
+ float heightT = Mathf.InverseLerp(-waveHeight, waveHeight, startY);
+ Color lineColor = Color.Lerp(edgeDarkColor, edgeLightColor, heightT);
+ lineColor.a *= 0.8f; // 设置透明度
+
+ // 绘制边缘线
+ Draw.Line(start, end, lineWidth * 0.5f, lineColor);
+ }
+
+ private void DrawEdgeLines(float halfField, float halfVisible)
+ {
+ // 绘制湖面边缘的向下线条(无扰动)
+ float step = fieldSize / (pointCount - 1);
+ float halfEdgeLineLength = edgeLineLength * 0.5f; // 设置边缘线长度
+
+ // 只在field边界处绘制线条,且仅当边界在可视区域内时绘制
+ // 1. 绘制 X 轴的边缘线(左边和右边)
+ for (float z = -halfField; z <= halfField; z += step)
+ {
+ // 检查边界点是否在可视区域内
+ if (Mathf.Abs(z) <= halfVisible)
+ {
+ float x = halfField; // 右边
+ DrawEdgeLine(x, z, halfVisible);
+ x = -halfField; // 左边
+ DrawEdgeLine(x, z, halfVisible);
+ }
+ }
+
+ // 2. 绘制 Z 轴的边缘线(上边和下边)
+ for (float x = -halfField; x <= halfField; x += step)
+ {
+ // 检查边界点是否在可视区域内
+ if (Mathf.Abs(x) <= halfVisible)
+ {
+ float z = halfField; // 上边
+ DrawEdgeLine(x, z, halfVisible);
+ z = -halfField; // 下边
+ DrawEdgeLine(x, z, halfVisible);
+ }
+ }
+ }
+
+ // 绘制目标点
+ private void DrawTargetPoints()
+ {
+ float step = fieldSize / (pointCount - 1);
+ float halfField = fieldSize * 0.5f;
+ float halfVisible = visibleAreaSize * 0.5f;
+
+ foreach (var target in targetPoints)
+ {
+ // 将网格位置转换为世界坐标
+ float x = -halfField + target.gridPosition.x * step + fieldOffset.x;
+ float z = -halfField + target.gridPosition.y * step + fieldOffset.y;
+
+ // 检查是否在可视区域内
+ if (Mathf.Abs(x) > halfVisible || Mathf.Abs(z) > halfVisible)
+ {
+ continue;
+ }
+
+ // 获取该点的高度
+ float height = GetHeight(x, z, time);
+
+ // 添加额外的起伏效果和高度偏移
+ float floatOffset = Mathf.Sin(time * floatFrequency) * floatAmplitude;
+ Vector3 position = new Vector3(x, height + floatOffset + targetHeightOffset, z);
+
+ // 计算旋转
+ float rotation = time * rotationSpeed;
+ Quaternion rot = Quaternion.Euler(0, rotation, 0);
+
+ // 绘制外层立方体线框
+ DrawWireCube(position, rot, targetSize * wireScale, targetWireColor);
+
+ // 根据类型绘制内部形状
+ switch (target.type)
+ {
+ case TargetType.Sphere:
+ Draw.Sphere(position, targetSize * 0.8f, targetFillColor);
+ break;
+ case TargetType.Cube:
+ Draw.Cube(position, rot, targetSize * 0.8f, targetFillColor);
+ break;
+ case TargetType.Torus:
+ Draw.Torus(position, rot, targetSize * 0.8f, targetSize * 0.3f, targetFillColor);
+ break;
+ }
+ }
+ }
+
+ private void DrawWireCube(Vector3 position, Quaternion rotation, float size, Color color)
+ {
+ Vector3[] vertices = new Vector3[]
+ {
+ new Vector3(-size, -size, -size),
+ new Vector3(size, -size, -size),
+ new Vector3(size, size, -size),
+ new Vector3(-size, size, -size),
+ new Vector3(-size, -size, size),
+ new Vector3(size, -size, size),
+ new Vector3(size, size, size),
+ new Vector3(-size, size, size)
+ };
+
+ // 应用旋转
+ for (int i = 0; i < vertices.Length; i++)
+ {
+ vertices[i] = rotation * vertices[i] + position;
+ }
+
+ // 绘制边
+ int[] edges = new int[]
+ {
+ 0,1, 1,2, 2,3, 3,0, // 底面
+ 4,5, 5,6, 6,7, 7,4, // 顶面
+ 0,4, 1,5, 2,6, 3,7 // 连接线
+ };
+
+ for (int i = 0; i < edges.Length; i += 2)
+ {
+ Draw.Line(vertices[edges[i]], vertices[edges[i+1]], targetLineWidth, color);
+ }
+ }
}
diff --git a/Assets/Scripts/MiniGame/HuoShan/Emo/LakeUIController.cs b/Assets/Scripts/MiniGame/HuoShan/Emo/LakeUIController.cs
new file mode 100644
index 000000000..ffe61302b
--- /dev/null
+++ b/Assets/Scripts/MiniGame/HuoShan/Emo/LakeUIController.cs
@@ -0,0 +1,29 @@
+using UnityEngine;
+using UnityEngine.UI;
+using Shapes;
+
+public class LakeUIController : MonoBehaviour
+{
+ [SerializeField] private LakeLineDrawer lakeDrawer;
+ public Slider xOffsetSlider;
+ public Slider zOffsetSlider;
+
+ private void Start()
+ {
+ // 设置滑动条的初始值
+ if (xOffsetSlider != null && zOffsetSlider != null)
+ {
+ xOffsetSlider.minValue = -1f;
+ xOffsetSlider.maxValue = 1f;
+ xOffsetSlider.value = 0f;
+
+ zOffsetSlider.minValue = -1f;
+ zOffsetSlider.maxValue = 1f;
+ zOffsetSlider.value = 0f;
+
+ // 将滑动条引用传递给LakeLineDrawer
+ lakeDrawer.xOffsetSlider = xOffsetSlider;
+ lakeDrawer.zOffsetSlider = zOffsetSlider;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/MiniGame/HuoShan/Emo/LakeUIController.cs.meta b/Assets/Scripts/MiniGame/HuoShan/Emo/LakeUIController.cs.meta
new file mode 100644
index 000000000..2e4df005e
--- /dev/null
+++ b/Assets/Scripts/MiniGame/HuoShan/Emo/LakeUIController.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6709e527ba5cd1a43802e44a9de467d8
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MiniGame/HuoShan/Emo/LakeVisualizer.cs b/Assets/Scripts/MiniGame/HuoShan/Emo/LakeVisualizer.cs
new file mode 100644
index 000000000..df179bea9
--- /dev/null
+++ b/Assets/Scripts/MiniGame/HuoShan/Emo/LakeVisualizer.cs
@@ -0,0 +1,195 @@
+using UnityEngine;
+using Shapes;
+using System.Collections.Generic;
+
+[ExecuteAlways]
+public class LakeVisualizer : ImmediateModeShapeDrawer
+{
+ [Header("网格设置")]
+ public float fieldSize = 20f;
+ public int pointCount = 30;
+ public float pointSize = 0.15f;
+ public float lineWidth = 0.03f;
+
+ [Header("波动参数")]
+ public float noiseScale = 0.3f;
+ public float waveHeight = 1.5f;
+ public float waveSpeed = 1f;
+ public float timeScale = 1f;
+
+ [Header("涟漪参数")]
+ public float rippleStrength = 2f;
+ public float rippleDuration = 1.5f;
+ public float rippleSpreadSpeed = 6f;
+ public float rippleSharpness = 2f;
+
+ [Header("目标设置")]
+ public Vector2 targetPosition = Vector2.zero;
+ public float shapeChangeRadius = 4f; // 控制形状混合的范围
+
+ private Vector3[] points;
+ private float time;
+
+ private struct Ripple
+ {
+ public Vector2 position;
+ public float startTime;
+ }
+
+ private List ripples = new List();
+
+ private void Update()
+ {
+ time = Application.isPlaying ? Time.time * timeScale : 0f;
+
+ if (Application.isPlaying && Input.GetMouseButtonDown(0))
+ {
+ Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
+ if (Physics.Raycast(ray, out RaycastHit hit))
+ {
+ ripples.Add(new Ripple
+ {
+ position = new Vector2(hit.point.x, hit.point.z),
+ startTime = Time.time
+ });
+ }
+ }
+
+ ripples.RemoveAll(r => Time.time - r.startTime > rippleDuration);
+ }
+
+ private float GetNoiseHeight(float x, float z, float currentTime)
+ {
+ float noise = 0f;
+ float amp = 1f;
+ float freq = 1f;
+
+ for (int i = 0; i < 3; i++)
+ {
+ float nx = x * freq * noiseScale;
+ float nz = z * freq * noiseScale;
+ float nt = currentTime * waveSpeed * freq;
+ noise += Mathf.PerlinNoise(nx + nt, nz + nt) * amp;
+ amp *= 0.5f;
+ freq *= 2f;
+ }
+
+ return noise * waveHeight;
+ }
+
+ public override void DrawShapes(Camera cam)
+ {
+ using (Draw.Command(cam))
+ {
+ Draw.ResetAllDrawStates();
+ Draw.LineGeometry = LineGeometry.Volumetric3D;
+ Draw.Thickness = lineWidth;
+
+ float step = fieldSize / (pointCount - 1);
+ float halfSize = fieldSize * 0.5f;
+
+ if (points == null || points.Length != pointCount * pointCount)
+ points = new Vector3[pointCount * pointCount];
+
+ for (int i = 0; i < pointCount; i++)
+ {
+ for (int j = 0; j < pointCount; j++)
+ {
+ float x = -halfSize + j * step;
+ float z = -halfSize + i * step;
+ Vector2 pos2D = new Vector2(x, z);
+
+ float baseY = GetNoiseHeight(x, z, time);
+ float rippleY = 0f;
+ float brightness = 0f;
+ float shapeBlend = 0f;
+
+ foreach (var ripple in ripples)
+ {
+ float elapsed = Time.time - ripple.startTime;
+ float spread = elapsed * rippleSpreadSpeed;
+ float dist = Vector2.Distance(pos2D, ripple.position);
+
+ float ease = Mathf.Sin(Mathf.Clamp01(elapsed / rippleDuration) * Mathf.PI);
+ float spike = Mathf.Exp(-Mathf.Pow(dist - spread, 2f) * rippleSharpness);
+ float bright = Mathf.Exp(-Mathf.Pow((dist - spread) * 0.5f, 2f));
+
+ rippleY += spike * rippleStrength * ease;
+ brightness += bright * ease;
+
+ // 目标点接近程度影响形状混合程度
+ float targetDist = Vector2.Distance(ripple.position, targetPosition);
+ float shapeFactor = Mathf.Clamp01(1f - targetDist / shapeChangeRadius);
+ shapeBlend = Mathf.Max(shapeBlend, shapeFactor * ease);
+ }
+
+ float finalY = baseY + rippleY;
+ Vector3 worldPos = new Vector3(x, finalY, z);
+ points[i * pointCount + j] = worldPos;
+
+ float depth = (finalY + waveHeight) / (waveHeight * 2f);
+ float brightnessScale = Mathf.Clamp01(1f + brightness);
+ Color pointColor = Color.Lerp(new Color(0.5f, 1f, 1f), new Color(0f, 0.5f, 1f), depth);
+ pointColor *= brightnessScale;
+
+ float scale = pointSize * (1f - depth * 0.5f);
+
+ // 形状混合逻辑(近似插值)
+ if (shapeBlend < 0.1f)
+ {
+ Draw.Sphere(worldPos, scale, pointColor);
+ }
+ else if (shapeBlend < 0.3f)
+ {
+ Draw.Torus(worldPos, scale * 0.6f, scale * 0.2f, pointColor); // 环形
+ }
+ else if (shapeBlend < 0.6f)
+ {
+ Draw.Cube(worldPos, scale * 1.4f, pointColor); // 立方体
+ }
+ else if (shapeBlend < 0.9f)
+ {
+ Draw.Cone(worldPos, scale * 1.6f, scale * 0.5f, pointColor); // 锥体
+ }
+ else
+ {
+ Vector3 a = worldPos + Vector3.up * scale;
+ Vector3 b = worldPos + new Vector3(scale, -scale, 0);
+ Vector3 c = worldPos + new Vector3(-scale, -scale, 0);
+ Draw.Triangle(a, b, c, pointColor); // 三角形
+ }
+ }
+ }
+
+ // 连接线条(可选)
+ for (int i = 0; i < pointCount; i++)
+ {
+ for (int j = 0; j < pointCount; j++)
+ {
+ int index = i * pointCount + j;
+ Vector3 current = points[index];
+
+ if (j < pointCount - 1)
+ {
+ Vector3 next = points[index + 1];
+ DrawLine(current, next);
+ }
+
+ if (i < pointCount - 1)
+ {
+ Vector3 next = points[index + pointCount];
+ DrawLine(current, next);
+ }
+ }
+ }
+ }
+ }
+
+ void DrawLine(Vector3 a, Vector3 b)
+ {
+ float avgY = (a.y + b.y) * 0.5f;
+ float lineDepth = (avgY + waveHeight) / (waveHeight * 2f);
+ Color lineColor = Color.Lerp(Color.cyan, new Color(0, 0.5f, 1f, 0.3f), lineDepth);
+ Draw.Line(a, b, lineWidth * (1f - lineDepth * 0.5f), lineColor);
+ }
+}
diff --git a/Assets/Scripts/MiniGame/HuoShan/Emo/LakeVisualizer.cs.meta b/Assets/Scripts/MiniGame/HuoShan/Emo/LakeVisualizer.cs.meta
new file mode 100644
index 000000000..4ca656df3
--- /dev/null
+++ b/Assets/Scripts/MiniGame/HuoShan/Emo/LakeVisualizer.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 874c4686e7644b74f83e1c0a58b26b34
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MiniGame/HuoShan/Emo/RippleManager.cs b/Assets/Scripts/MiniGame/HuoShan/Emo/RippleManager.cs
new file mode 100644
index 000000000..144627721
--- /dev/null
+++ b/Assets/Scripts/MiniGame/HuoShan/Emo/RippleManager.cs
@@ -0,0 +1,79 @@
+using UnityEngine;
+using System.Collections.Generic;
+
+public struct Ripple
+{
+ public Vector3 position;
+ public float startTime;
+ public float strength;
+}
+
+public struct RippleResult
+{
+ public float height;
+ public float brightness;
+}
+
+public class RippleManager
+{
+ private List ripples = new List();
+ private float rippleStrength;
+ private float rippleDuration;
+ private float rippleSpreadSpeed;
+ private float rippleSharpness;
+ private float rippleMaxRadius;
+
+ public RippleManager(float strength, float duration, float spreadSpeed, float sharpness, float maxRadius)
+ {
+ rippleStrength = strength;
+ rippleDuration = duration;
+ rippleSpreadSpeed = spreadSpeed;
+ rippleSharpness = sharpness;
+ rippleMaxRadius = maxRadius;
+ }
+
+ public void AddRipple(Vector3 position)
+ {
+ ripples.Add(new Ripple
+ {
+ position = position,
+ startTime = Time.time,
+ strength = rippleStrength
+ });
+ }
+
+ public void CleanupRipples()
+ {
+ ripples.RemoveAll(r => Time.time - r.startTime > rippleDuration);
+ }
+
+ public RippleResult GetRippleEffect(Vector3 position, float currentTime)
+ {
+ float totalHeight = 0f;
+ float totalBrightness = 0f;
+
+ foreach (var ripple in ripples)
+ {
+ float timeSinceStart = currentTime - ripple.startTime;
+ if (timeSinceStart > rippleDuration) continue;
+
+ float distance = Vector3.Distance(position, ripple.position);
+ float maxDistance = rippleSpreadSpeed * timeSinceStart;
+
+ if (distance > maxDistance || distance > rippleMaxRadius) continue;
+
+ float distFactor = Mathf.Exp(-distance * rippleSharpness);
+ float timeFactor = 1f - (timeSinceStart / rippleDuration);
+ float strength = ripple.strength * distFactor * timeFactor;
+
+ totalHeight += strength;
+ totalBrightness += strength;
+ }
+
+ return new RippleResult
+ {
+ height = totalHeight,
+ brightness = totalBrightness
+ };
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/MiniGame/HuoShan/Emo/RippleManager.cs.meta b/Assets/Scripts/MiniGame/HuoShan/Emo/RippleManager.cs.meta
new file mode 100644
index 000000000..d115b058d
--- /dev/null
+++ b/Assets/Scripts/MiniGame/HuoShan/Emo/RippleManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ea17c12f760878e4dadd86d12ad6ca8a
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MiniGame/HuoShan/Emo/TargetPointManager.cs b/Assets/Scripts/MiniGame/HuoShan/Emo/TargetPointManager.cs
new file mode 100644
index 000000000..f3f264359
--- /dev/null
+++ b/Assets/Scripts/MiniGame/HuoShan/Emo/TargetPointManager.cs
@@ -0,0 +1,112 @@
+using UnityEngine;
+using System.Collections.Generic;
+using Shapes;
+
+public enum TargetType
+{
+ Sphere,
+ Cube,
+ Torus
+}
+
+public class TargetPointManager
+{
+ private List targetPoints = new List();
+ private List targetTypes = new List();
+ private float targetSize;
+ private float wireScale;
+ private float heightOffset;
+ private Color entityColor;
+ private Color wireColor;
+ private float rotationSpeed;
+ private float floatSpeed;
+ private float floatHeight;
+
+ public TargetPointManager(float size, float wireScale, float height, Color entity, Color wire, float rotSpeed, float floatSpeed, float floatHeight)
+ {
+ this.targetSize = size;
+ this.wireScale = wireScale;
+ this.heightOffset = height;
+ this.entityColor = entity;
+ this.wireColor = wire;
+ this.rotationSpeed = rotSpeed;
+ this.floatSpeed = floatSpeed;
+ this.floatHeight = floatHeight;
+ }
+
+ public void AddTargetPoint(Vector3 position, TargetType type)
+ {
+ targetPoints.Add(position);
+ targetTypes.Add(type);
+ }
+
+ public void ClearTargetPoints()
+ {
+ targetPoints.Clear();
+ targetTypes.Clear();
+ }
+
+ public void DrawTargetPoints(float currentTime)
+ {
+ for (int i = 0; i < targetPoints.Count; i++)
+ {
+ Vector3 pos = targetPoints[i];
+ TargetType type = targetTypes[i];
+
+ // 计算浮动效果
+ float floatOffset = Mathf.Sin(currentTime * floatSpeed) * floatHeight;
+ Vector3 finalPos = pos + Vector3.up * (heightOffset + floatOffset);
+
+ // 绘制外框(立方体)
+ DrawWireCube(finalPos, targetSize * wireScale, wireColor);
+
+ // 绘制内部形状
+ switch (type)
+ {
+ case TargetType.Sphere:
+ Draw.Sphere(finalPos, targetSize * 0.8f, entityColor);
+ break;
+ case TargetType.Cube:
+ Draw.Cube(finalPos, Quaternion.Euler(0, currentTime * rotationSpeed, 0), targetSize * 0.8f, entityColor);
+ break;
+ case TargetType.Torus:
+ Draw.Torus(finalPos, Quaternion.Euler(0, currentTime * rotationSpeed, 0), targetSize * 0.8f, targetSize * 0.2f, entityColor);
+ break;
+ }
+ }
+ }
+
+ private void DrawWireCube(Vector3 position, float size, Color color)
+ {
+ float halfSize = size / 2f;
+ Vector3[] points = new Vector3[]
+ {
+ position + new Vector3(-halfSize, -halfSize, -halfSize),
+ position + new Vector3(halfSize, -halfSize, -halfSize),
+ position + new Vector3(halfSize, -halfSize, halfSize),
+ position + new Vector3(-halfSize, -halfSize, halfSize),
+ position + new Vector3(-halfSize, halfSize, -halfSize),
+ position + new Vector3(halfSize, halfSize, -halfSize),
+ position + new Vector3(halfSize, halfSize, halfSize),
+ position + new Vector3(-halfSize, halfSize, halfSize)
+ };
+
+ // 绘制底面
+ Draw.Line(points[0], points[1], 0.1f, color);
+ Draw.Line(points[1], points[2], 0.1f, color);
+ Draw.Line(points[2], points[3], 0.1f, color);
+ Draw.Line(points[3], points[0], 0.1f, color);
+
+ // 绘制顶面
+ Draw.Line(points[4], points[5], 0.1f, color);
+ Draw.Line(points[5], points[6], 0.1f, color);
+ Draw.Line(points[6], points[7], 0.1f, color);
+ Draw.Line(points[7], points[4], 0.1f, color);
+
+ // 绘制连接线
+ Draw.Line(points[0], points[4], 0.1f, color);
+ Draw.Line(points[1], points[5], 0.1f, color);
+ Draw.Line(points[2], points[6], 0.1f, color);
+ Draw.Line(points[3], points[7], 0.1f, color);
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/MiniGame/HuoShan/Emo/TargetPointManager.cs.meta b/Assets/Scripts/MiniGame/HuoShan/Emo/TargetPointManager.cs.meta
new file mode 100644
index 000000000..5ac62e2fe
--- /dev/null
+++ b/Assets/Scripts/MiniGame/HuoShan/Emo/TargetPointManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b8d5ffa5489c71c48951644fc2c52117
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MiniGame/HuoShan/Emo/WaveGenerator.cs b/Assets/Scripts/MiniGame/HuoShan/Emo/WaveGenerator.cs
new file mode 100644
index 000000000..e4f4e33aa
--- /dev/null
+++ b/Assets/Scripts/MiniGame/HuoShan/Emo/WaveGenerator.cs
@@ -0,0 +1,21 @@
+using UnityEngine;
+
+public class WaveGenerator
+{
+ private float noiseScale;
+ private float waveHeight;
+ private float waveSpeed;
+
+ public WaveGenerator(float noiseScale, float waveHeight, float waveSpeed)
+ {
+ this.noiseScale = noiseScale;
+ this.waveHeight = waveHeight;
+ this.waveSpeed = waveSpeed;
+ }
+
+ public float GetHeight(float x, float z, float time)
+ {
+ float noise = Mathf.PerlinNoise(x * noiseScale + time * waveSpeed, z * noiseScale + time * waveSpeed);
+ return Mathf.Lerp(-waveHeight, waveHeight, noise);
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/MiniGame/HuoShan/Emo/WaveGenerator.cs.meta b/Assets/Scripts/MiniGame/HuoShan/Emo/WaveGenerator.cs.meta
new file mode 100644
index 000000000..6690e5478
--- /dev/null
+++ b/Assets/Scripts/MiniGame/HuoShan/Emo/WaveGenerator.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ed485db0b6bd66943af4f7b138357992
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant: