From 83da5b3196f7e77941d0646657f39e7f16aeca19 Mon Sep 17 00:00:00 2001 From: "Bob.Song" Date: Thu, 26 Mar 2026 12:18:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B5=AE=E6=BC=82=E5=92=8C?= =?UTF-8?q?=E7=BB=B3=E5=AD=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/New Terrain 12.asset | Bin 1958860 -> 557364 bytes .../Resources/ES3/ES3Defaults.asset | 14 - Assets/Scenes/BobberTest.unity | 2579 +++++++++-------- Assets/Scripts/Fishing/Rope/Rope.cs | 47 +- .../Test/New/BobberPresentationController.cs | 172 +- Assets/Water2.mat | 256 ++ Assets/Water2.mat.meta | 8 + .../Runtime/Materials/Water Volume.mat | 3 + ProjectSettings/ProjectSettings.asset | 2 +- UserSettings/EditorUserSettings.asset | 16 +- 10 files changed, 1774 insertions(+), 1323 deletions(-) create mode 100644 Assets/Water2.mat create mode 100644 Assets/Water2.mat.meta diff --git a/Assets/New Terrain 12.asset b/Assets/New Terrain 12.asset index b274519786a966f17f736b5d48a718a4ec4c03be..b57d809e6637d20ae903c3fb2d8998a12471ebf2 100644 GIT binary patch delta 133 zcmX?eynIWO(gZOb2~!3T;Ak`f(+m;?5SoF(%)r1v&q&YEG|iCV-~a#r85uV^eHWKv zgvd8=zJnEmCMT-8PUcWmn0#M_v)NO%-BXnjh?#(x8Hibcm=%cGfS7%|rz%Hr F1^}rv9)SP= literal 1958860 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 zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jY+axi zi;wNtdS7>3Min!)&+j$5nC^}Q~?DPP(T3%6i`3` z1r$&~0Rj>oJpVJ /// 简单水面接口。你可以替换成自己的水系统。 /// @@ -26,10 +28,10 @@ public enum BobberControlMode public enum BobberBiteType { None, - Tap, // 轻点 - SlowSink, // 缓沉 - Lift, // 送漂 - BlackDrift // 黑漂/快速拖入 + Tap, // 轻点 + SlowSink, // 缓沉 + Lift, // 送漂 + BlackDrift // 黑漂/快速拖入 } public enum BobberPosture @@ -43,135 +45,106 @@ public enum BobberPosture [RequireComponent(typeof(Rigidbody))] public class BobberPresentationController : MonoBehaviour { - [Header("Water")] - [Tooltip("没有水提供器时使用固定水位")] + [Header("Water")] [Tooltip("没有水提供器时使用固定水位")] public float fallbackWaterLevel = 0f; + [Tooltip("Crest 水体。为空时会尝试从 SceneSettings 读取")] + public WaterRenderer waterRenderer; + + [Tooltip("Crest 查询层级")] public CollisionLayer waterCollisionLayer = CollisionLayer.AfterAnimatedWaves; + + [Tooltip("Crest 波面查询宽度(参考 BobberFloating)")] + public float waterQueryObjectWidth = 0.5f; + [Tooltip("可选:挂实现了 IWaterSurfaceProvider 的组件")] public MonoBehaviour waterProviderBehaviour; - [Header("Enter Water")] - [Tooltip("底部进入水面多少米后切换为漂像控制")] + [Header("Enter Water")] [Tooltip("底部进入水面多少米后切换为漂像控制")] public float enterWaterDepth = 0.002f; - [Tooltip("离开水面多少米后回到空中物理。一般给负值做滞回")] - public float exitWaterDepth = -0.01f; + [Tooltip("离开水面多少米后回到空中物理。一般给负值做滞回")] public float exitWaterDepth = -0.01f; - [Header("Geometry")] - [Tooltip("浮漂总高度(米)")] + [Header("Geometry")] [Tooltip("浮漂总高度(米)")] public float floatHeight = 0.08f; [Tooltip("如果 Pivot 在浮漂底部,这里填 0;如果 Pivot 在模型中心,就填底部相对 Pivot 的本地 Y")] public float bottomOffsetLocalY = 0f; - [Header("Base Float")] - [Tooltip("基础吃铅比例,决定静止时有多少在水下")] - [Range(0.05f, 0.95f)] + [Header("Base Float")] [Tooltip("基础吃铅比例,决定静止时有多少在水下")] [Range(0.05f, 0.95f)] public float baseSubmergeRatio = 0.28f; - [Tooltip("Y 轴平滑时间,越小响应越快")] - public float ySmoothTime = 0.08f; + [Tooltip("Y 轴平滑时间,越小响应越快")] public float ySmoothTime = 0.08f; - [Tooltip("最大竖直速度限制(用于 SmoothDamp)")] - public float maxYSpeed = 2f; + [Tooltip("最大竖直速度限制(用于 SmoothDamp)")] public float maxYSpeed = 2f; - [Tooltip("静止小死区,减少微抖")] - public float yDeadZone = 0.0005f; + [Tooltip("静止小死区,减少微抖")] public float yDeadZone = 0.0005f; - [Header("Surface Motion")] - [Tooltip("是否启用轻微水面起伏")] + [Header("Surface Motion")] [Tooltip("是否启用轻微水面起伏")] public bool enableSurfaceBobbing = true; - [Tooltip("水面轻微起伏振幅(米)")] - public float surfaceBobAmplitude = 0.0015f; + [Tooltip("水面轻微起伏振幅(米)")] public float surfaceBobAmplitude = 0.0015f; - [Tooltip("水面轻微起伏频率")] - public float surfaceBobFrequency = 1.2f; + [Tooltip("水面轻微起伏频率")] public float surfaceBobFrequency = 1.2f; - [Header("XZ Motion")] - [Tooltip("入水后是否锁定 XZ 到入水点附近")] + [Header("XZ Motion")] [Tooltip("入水后是否锁定 XZ 到入水点附近")] public bool lockXZAroundAnchor = true; - [Tooltip("XZ 跟随平滑时间")] - public float xzSmoothTime = 0.15f; + [Tooltip("XZ 跟随平滑时间")] public float xzSmoothTime = 0.15f; - [Tooltip("水流/拖拽带来的额外平面偏移最大值")] - public float maxPlanarOffset = 0.15f; + [Tooltip("水流/拖拽带来的额外平面偏移最大值")] public float maxPlanarOffset = 0.15f; - [Header("Sink By Weight / Tension")] - [Tooltip("外部向下拉力映射为下沉量的系数。你可以把钩/铅/线组的等效向下拉力喂进来")] + [Header("Sink By Weight / Tension")] [Tooltip("外部向下拉力映射为下沉量的系数。你可以把钩/铅/线组的等效向下拉力喂进来")] public float downForceToSink = 0.0025f; - [Tooltip("向下拉力下沉的最大附加量")] - public float maxExtraSink = 0.08f; + [Tooltip("向下拉力下沉的最大附加量")] public float maxExtraSink = 0.08f; - [Header("Bottom Touch")] - [Tooltip("触底时是否启用修正")] + [Header("Bottom Touch")] [Tooltip("触底时是否启用修正")] public bool enableBottomTouchAdjust = true; - [Tooltip("触底后减少的下沉量(例如铅坠到底,漂会回升一点)")] - public float bottomTouchLift = 0.01f; + [Tooltip("触底后减少的下沉量(例如铅坠到底,漂会回升一点)")] public float bottomTouchLift = 0.01f; - [Header("Posture Source")] - [Tooltip("下方 Lure / 钩组 / 铅坠的刚体。姿态主要根据它和浮漂的相对位置判断")] + [Header("Posture Source")] [Tooltip("下方 Lure / 钩组 / 铅坠的刚体。姿态主要根据它和浮漂的相对位置判断")] public Rigidbody lureBody; [Tooltip("用于归一化的参考长度。一般填:浮漂到 Lure 在“正常拉直”时的大致长度")] public float referenceLength = 0.30f; - [Header("Posture Threshold")] - [Tooltip("最小入水比例。不够时优先躺漂")] + [Header("Posture Threshold")] [Tooltip("最小入水比例。不够时优先躺漂")] public float minSubmergeToStand = 0.16f; - [Tooltip("垂直分量比低于该值时,优先躺漂")] - public float verticalLieThreshold = 0.18f; + [Tooltip("垂直分量比低于该值时,优先躺漂")] public float verticalLieThreshold = 0.18f; - [Tooltip("垂直分量比高于该值,且水平分量较小时,允许立漂")] - public float verticalUprightThreshold = 0.75f; + [Tooltip("垂直分量比高于该值,且水平分量较小时,允许立漂")] public float verticalUprightThreshold = 0.75f; - [Tooltip("水平分量比高于该值时,不允许完全立漂")] - public float planarTiltThreshold = 0.30f; + [Tooltip("水平分量比高于该值时,不允许完全立漂")] public float planarTiltThreshold = 0.30f; - [Tooltip("水平分量明显大于垂直分量时,优先躺漂")] - public float planarDominanceMultiplier = 1.20f; + [Tooltip("水平分量明显大于垂直分量时,优先躺漂")] public float planarDominanceMultiplier = 1.20f; - [Tooltip("姿态切换滞回")] - public float postureHysteresis = 0.04f; + [Tooltip("姿态切换滞回")] public float postureHysteresis = 0.04f; - [Header("Posture Rotation")] - [Tooltip("倾斜状态角度")] + [Header("Posture Rotation")] [Tooltip("倾斜状态角度")] public float tiltedAngle = 38f; - [Tooltip("躺漂角度")] - public float lyingAngle = 88f; + [Tooltip("躺漂角度")] public float lyingAngle = 88f; - [Tooltip("立漂时允许的最大附加倾角")] - public float uprightMaxTiltAngle = 8f; + [Tooltip("立漂时允许的最大附加倾角")] public float uprightMaxTiltAngle = 8f; - [Tooltip("平面方向对立漂/斜漂附加倾角的影响强度")] - public float planarTiltFactor = 120f; + [Tooltip("平面方向对立漂/斜漂附加倾角的影响强度")] public float planarTiltFactor = 120f; - [Tooltip("姿态平滑速度")] - public float rotationLerpSpeed = 8f; + [Tooltip("姿态平滑速度")] public float rotationLerpSpeed = 8f; - [Header("Debug Input")] - [Tooltip("调试:按 R 恢复默认")] + [Header("Debug Input")] [Tooltip("调试:按 R 恢复默认")] public bool debugResetKey = true; - [Tooltip("调试:按 T 触发轻点")] - public bool debugTapKey = true; + [Tooltip("调试:按 T 触发轻点")] public bool debugTapKey = true; - [Tooltip("调试:按 G 触发缓沉")] - public bool debugSlowSinkKey = true; + [Tooltip("调试:按 G 触发缓沉")] public bool debugSlowSinkKey = true; - [Tooltip("调试:按 H 触发送漂")] - public bool debugLiftKey = true; + [Tooltip("调试:按 H 触发送漂")] public bool debugLiftKey = true; - [Tooltip("调试:按 B 触发黑漂")] - public bool debugBlackDriftKey = true; + [Tooltip("调试:按 B 触发黑漂")] public bool debugBlackDriftKey = true; - [Header("Debug")] - public bool drawDebug = false; + [Header("Debug")] public bool drawDebug = false; public BobberControlMode CurrentMode => _mode; public BobberPosture CurrentPosture => _posture; @@ -218,6 +191,12 @@ public class BobberPresentationController : MonoBehaviour private float _verticalDistance; private float _planarDistance; + private bool _hasCrestSampleThisFrame; + private readonly Vector3[] _waterQueryPoints = new Vector3[1]; + private readonly Vector3[] _waterQueryResultDisplacements = new Vector3[1]; + private readonly Vector3[] _waterQueryResultVelocities = new Vector3[1]; + private readonly Vector3[] _waterQueryResultNormal = new Vector3[1]; + private void Awake() { _rb = GetComponent(); @@ -229,6 +208,9 @@ public class BobberPresentationController : MonoBehaviour if (waterProviderBehaviour != null) _waterProvider = waterProviderBehaviour as IWaterSurfaceProvider; + if (waterRenderer == null && SceneSettings.Instance != null) + waterRenderer = SceneSettings.Instance.Water; + _targetRotation = transform.rotation; } @@ -404,7 +386,7 @@ public class BobberPresentationController : MonoBehaviour } float surfaceBob = 0f; - if (enableSurfaceBobbing) + if (enableSurfaceBobbing && !_hasCrestSampleThisFrame) { surfaceBob = Mathf.Sin(Time.time * surfaceBobFrequency * Mathf.PI * 2f) * surfaceBobAmplitude; } @@ -701,6 +683,7 @@ public class BobberPresentationController : MonoBehaviour float k = (t - 0.35f) / 0.65f; targetOffset = -Mathf.Lerp(_biteAmplitude, 0f, k); } + break; case BobberBiteType.SlowSink: @@ -742,7 +725,35 @@ public class BobberPresentationController : MonoBehaviour private float GetWaterHeight(Vector3 worldPos) { - return _waterProvider != null ? _waterProvider.GetWaterHeight(worldPos) : fallbackWaterLevel; + if (_waterProvider != null) + { + _hasCrestSampleThisFrame = false; + return _waterProvider.GetWaterHeight(worldPos); + } + + if ( + waterRenderer != null + && waterRenderer.AnimatedWavesLod != null + && waterRenderer.AnimatedWavesLod.Provider != null + ) + { + _waterQueryPoints[0] = worldPos; + waterRenderer.AnimatedWavesLod.Provider.Query( + GetHashCode(), + Mathf.Max(0.001f, waterQueryObjectWidth), + _waterQueryPoints, + _waterQueryResultDisplacements, + _waterQueryResultNormal, + _waterQueryResultVelocities, + waterCollisionLayer + ); + + _hasCrestSampleThisFrame = true; + return _waterQueryResultDisplacements[0].y + waterRenderer.SeaLevel; + } + + _hasCrestSampleThisFrame = false; + return fallbackWaterLevel; } private Vector3 GetBottomWorldPosition() @@ -821,6 +832,7 @@ public class BobberPresentationController : MonoBehaviour maxExtraSink = Mathf.Max(0f, maxExtraSink); surfaceBobAmplitude = Mathf.Max(0f, surfaceBobAmplitude); surfaceBobFrequency = Mathf.Max(0f, surfaceBobFrequency); + waterQueryObjectWidth = Mathf.Max(0.001f, waterQueryObjectWidth); yDeadZone = Mathf.Max(0f, yDeadZone); referenceLength = Mathf.Max(0.0001f, referenceLength); @@ -839,4 +851,4 @@ public class BobberPresentationController : MonoBehaviour #endif #endregion -} \ No newline at end of file +} diff --git a/Assets/Water2.mat b/Assets/Water2.mat new file mode 100644 index 000000000..8d268b71a --- /dev/null +++ b/Assets/Water2.mat @@ -0,0 +1,256 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-8686106315147607512 +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: da692e001514ec24dbc4cca1949ff7e8, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.HighDefinition.Editor::UnityEditor.Rendering.HighDefinition.AssetVersion + version: 13 + hdPluginSubTargetMaterialVersions: + m_Keys: [] + m_Values: +--- !u!114 &-8485023484760234584 +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: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion + version: 10 +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Water2 + m_Shader: {fileID: -6465566751694194690, guid: 00ffe7d0b7161420897069dc6e12822c, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _ALPHATEST_ON + - _BUILTIN_ALPHATEST_ON + - _BUILTIN_AlphaClip + - _BUILTIN_SURFACE_TYPE_TRANSPARENT + - _DOUBLESIDED_ON + - _ENABLE_FOG_ON_TRANSPARENT + - _REFRACTION_PLANE + - _SURFACE_TYPE_TRANSPARENT + - _TRANSPARENT_WRITES_MOTION_VEC + m_InvalidKeywords: [] + m_LightmapFlags: 2 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 1 + m_CustomRenderQueue: 3000 + stringTagMap: + MotionVector: User + RenderType: Transparent + disabledShaderPasses: + - SHADOWCASTER + - MOTIONVECTORS + - TransparentDepthPostpass + - TransparentBackface + - RayTracingPrepass + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _Crest_CausticsDistortionTexture: + m_Texture: {fileID: 2800000, guid: 7aa3f69cfb40b429a865c45a7271c5f5, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Crest_CausticsTexture: + m_Texture: {fileID: 2800000, guid: 1407209016967410da2ae6fdd4d97fc6, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Crest_FoamTexture: + m_Texture: {fileID: 2800000, guid: 959dd0505e2c54585865f51257daa0e3, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Crest_NormalMapTexture: + m_Texture: {fileID: 2800000, guid: 7aa3f69cfb40b429a865c45a7271c5f5, type: 3} + 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: + - CREST_FLOW: 0 + - _AddPrecomputedVelocity: 0 + - _AlphaClip: 1 + - _AlphaCutoffEnable: 1 + - _AlphaDstBlend: 10 + - _AlphaSrcBlend: 1 + - _AlphaToMask: 0 + - _BUILTIN_AlphaClip: 1 + - _BUILTIN_Blend: 0 + - _BUILTIN_CullMode: 0 + - _BUILTIN_DstBlend: 10 + - _BUILTIN_QueueControl: 0 + - _BUILTIN_QueueOffset: 0 + - _BUILTIN_SrcBlend: 5 + - _BUILTIN_Surface: 1 + - _BUILTIN_TransparentReceiveShadows: 1 + - _BUILTIN_WorkflowMode: 1 + - _BUILTIN_ZTest: 4 + - _BUILTIN_ZWrite: 1 + - _BUILTIN_ZWriteControl: 1 + - _Blend: 0 + - _BlendMode: 0 + - _BlendModePreserveSpecular: 0 + - _CastShadows: 0 + - _ConservativeDepthOffsetEnable: 0 + - _Crest_AlbedoEnabled: 0 + - _Crest_AlbedoIgnoreFoam: 1 + - _Crest_AmbientTerm: 1 + - _Crest_Anisotropy: 0.5 + - _Crest_BUILTIN_ShadowCasterZTest: 4 + - _Crest_CausticsDepthOfField: 6 + - _Crest_CausticsDistortionScale: 250 + - _Crest_CausticsDistortionStrength: 0.16 + - _Crest_CausticsEnabled: 1 + - _Crest_CausticsFocalDepth: 2 + - _Crest_CausticsMotionBlur: 1 + - _Crest_CausticsScrollSpeed: 1 + - _Crest_CausticsStrength: 3.2 + - _Crest_CausticsTextureAverage: 0.07 + - _Crest_CausticsTextureScale: 50 + - _Crest_DirectTerm: 1 + - _Crest_FoamEnabled: 1 + - _Crest_FoamFeather: 0.75 + - _Crest_FoamIntensityAlbedo: 1 + - _Crest_FoamNormalStrength: 1 + - _Crest_FoamScale: 5 + - _Crest_FoamScrollSpeed: 1 + - _Crest_FoamSmoothness: 0.7 + - _Crest_MinimumReflectionDirectionY: 0.03 + - _Crest_NormalMapEnabled: 1 + - _Crest_NormalMapScale: 3 + - _Crest_NormalMapScrollSpeed: 1 + - _Crest_NormalMapStrength: 0.15 + - _Crest_NormalsStrengthOverall: 1 + - _Crest_Occlusion: 1 + - _Crest_OcclusionUnderwater: 0 + - _Crest_PlanarReflectionsDistortion: 1 + - _Crest_PlanarReflectionsEnabled: 0 + - _Crest_PlanarReflectionsIntensity: 1 + - _Crest_PlanarReflectionsRoughness: 1 + - _Crest_RefractionStrength: 1 + - _Crest_RefractiveIndexOfWater: 1.33 + - _Crest_SSSDirectionalFalloff: 2 + - _Crest_SSSEnabled: 0 + - _Crest_SSSIntensity: 3 + - _Crest_SSSPinchFalloff: 1.5 + - _Crest_SSSPinchMaximum: 1.67 + - _Crest_SSSPinchMinimum: 0.57 + - _Crest_ShadowCasterThreshold: 0.5 + - _Crest_ShadowsAffectsAmbientFactor: 0.5 + - _Crest_ShadowsEnabled: 1 + - _Crest_Smoothness: 0.9 + - _Crest_SmoothnessFalloff: 0.5 + - _Crest_SmoothnessFar: 0.8 + - _Crest_SmoothnessFarDistance: 4000 + - _Crest_Specular: 0.25 + - _Crest_TotalInternalReflectionIntensity: 0.8 + - _Crest_Version: 0 + - _Cull: 0 + - _CullMode: 0 + - _CullModeForward: 0 + - _DepthOffsetEnable: 0 + - _DoubleSidedEnable: 1 + - _DoubleSidedGIMode: 0 + - _DoubleSidedNormalMode: 2 + - _DstBlend: 10 + - _DstBlend2: 10 + - _DstBlendAlpha: 10 + - _EnableBlendModePreserveSpecularLighting: 0 + - _EnableFogOnTransparent: 1 + - _ExcludeFromTUAndAA: 0 + - _MaterialID: 1 + - _MaterialTypeMask: 18 + - _OpaqueCullMode: 2 + - _PerPixelSorting: 0 + - _QueueControl: 0 + - _QueueOffset: 0 + - _RayTracing: 0 + - _ReceiveShadows: 1 + - _ReceivesSSR: 1 + - _ReceivesSSRTransparent: 1 + - _RefractionModel: 1 + - _RenderQueueType: 4 + - _RequireSplitLighting: 0 + - _SrcBlend: 5 + - _SrcBlendAlpha: 1 + - _StencilRef: 0 + - _StencilRefDepth: 24 + - _StencilRefDistortionVec: 4 + - _StencilRefGBuffer: 10 + - _StencilRefMV: 40 + - _StencilWriteMask: 6 + - _StencilWriteMaskDepth: 25 + - _StencilWriteMaskDistortionVec: 4 + - _StencilWriteMaskGBuffer: 15 + - _StencilWriteMaskMV: 41 + - _SupportDecals: 1 + - _Surface: 1 + - _SurfaceType: 1 + - _TransmissionEnable: 1 + - _TransparentBackfaceEnable: 0 + - _TransparentCullMode: 2 + - _TransparentDepthPostpassEnable: 0 + - _TransparentDepthPrepassEnable: 0 + - _TransparentSortPriority: 0 + - _TransparentWritingMotionVec: 1 + - _TransparentZWrite: 1 + - _UseShadowThreshold: 0 + - _WorkflowMode: 1 + - _ZTest: 4 + - _ZTestDepthEqualForOpaque: 4 + - _ZTestGBuffer: 3 + - _ZTestTransparent: 4 + - _ZWrite: 1 + - _ZWriteControl: 1 + m_Colors: + - _Crest_Absorption: {r: 0.70086163, g: 0.236999, b: 0.106051564, a: 1} + - _Crest_AbsorptionColor: {r: 0.34162676, g: 0.6954546, b: 0.85, a: 0.1019608} + - _Crest_Scattering: {r: 0, g: 0.09803919, b: 0.19999996, a: 1} + - _DoubleSidedConstants: {r: 1, g: 1, b: 1, a: 0} + - _EmissionColor: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 +--- !u!114 &5462340382208678671 +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: 639247ca83abc874e893eb93af2b5e44, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.ShaderGraph.Editor::UnityEditor.Rendering.BuiltIn.AssetVersion + version: 0 diff --git a/Assets/Water2.mat.meta b/Assets/Water2.mat.meta new file mode 100644 index 000000000..311a77dba --- /dev/null +++ b/Assets/Water2.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c45c61012a9f980468bfce0c6f6f5f54 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Materials/Water Volume.mat b/Packages/com.waveharmonic.crest/Runtime/Materials/Water Volume.mat index ca31a78d1..8ec8d0d9c 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Materials/Water Volume.mat +++ b/Packages/com.waveharmonic.crest/Runtime/Materials/Water Volume.mat @@ -15,11 +15,14 @@ Material: - d_Crest_NoMaskDepth - d_Dithering m_InvalidKeywords: + - CREST_CAUSTICS_ON + - CREST_FOAM_ON - _ALPHATEST_ON - _BUILTIN_ALPHATEST_ON - _BUILTIN_AlphaClip - _BUILTIN_SURFACE_TYPE_TRANSPARENT - _DOUBLESIDED_ON + - _EMISSION - _ENABLE_FOG_ON_TRANSPARENT - _REFRACTION_PLANE - _SURFACE_TYPE_TRANSPARENT diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index d5c5cab1b..b69cfff0e 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -843,7 +843,7 @@ PlayerSettings: QNX: TextMeshPro;UNITY_VISUAL_SCRIPTING;ES3_TMPRO;ES3_UGUI;ENVIRO_3;ENVIRO_URP;UNITY_POST_PROCESSING_STACK_V2;DotSpatial ReservedCFE: TextMeshPro;ENVIRO_3;ENVIRO_URP;UNITY_POST_PROCESSING_STACK_V2;DotSpatial Server: UNITY_VISUAL_SCRIPTING;ES3_TMPRO;ES3_UGUI - Standalone: CINEMACHINE_URP;FAIRYGUI_TMPRO;OBI_ONI_SUPPORTED;TextMeshPro;UNITY_VISUAL_SCRIPTING;ES3_TMPRO;ES3_UGUI;STEAMWORKS_NET;ENVIRO_3;ENVIRO_URP;VLB_URP;UPPipeline;__MICROSPLAT__;__MICROSPLAT_SNOW__;__MICROSPLAT_ALPHAHOLE__;__MICROSPLAT_MESH__;__MICROSPLAT_STREAMS__;__MICROSPLAT_GLOBALTEXTURE__;__MICROSPLAT_TRAX__;__MICROSPLAT_DECAL__;__MICROSPLAT_SCATTER__;__MICROSPLAT_TEXTURECLUSTERS__;__MICROSPLAT_MESHTERRAIN__;__MICROSPLAT_DETAILRESAMPLE__;__MICROSPLAT_TERRAINBLEND__;__MICROSPLAT_TESSELLATION__;__MICROSPLAT_WINDGLITTER__;__MICROSPLAT_LOWPOLY__;__MICROSPLAT_OBJECTSHADER__;__MICROSPLAT_PROCTEX__;__MICROSPLAT_TRIPLANAR__;__MICROSPLAT_MICROVERSEPREVIEW__;UNITY_POST_PROCESSING_STACK_V2;DotSpatial;FANTASY_UNITY;KWS_HD_MODULE_INSTALLED;ODIN_INSPECTOR;ODIN_INSPECTOR_3;ODIN_INSPECTOR_3_1;ODIN_INSPECTOR_3_2;ODIN_INSPECTOR_3_3;KWS_URP;NWH_DWP2;GAIA_CINEMACHINE;GAIA_INPUT_SYSTEM;GAIA_2023;GAIA_2023_PRO;GAIA_MESH_PRESENT;GTS_PRESENT;GeNa_URP;GENA_PRO + Standalone: CINEMACHINE_URP;FAIRYGUI_TMPRO;OBI_ONI_SUPPORTED;TextMeshPro;UNITY_VISUAL_SCRIPTING;ES3_TMPRO;ES3_UGUI;STEAMWORKS_NET;ENVIRO_3;ENVIRO_URP;VLB_URP;UPPipeline;__MICROSPLAT__;__MICROSPLAT_SNOW__;__MICROSPLAT_ALPHAHOLE__;__MICROSPLAT_MESH__;__MICROSPLAT_STREAMS__;__MICROSPLAT_GLOBALTEXTURE__;__MICROSPLAT_TRAX__;__MICROSPLAT_DECAL__;__MICROSPLAT_SCATTER__;__MICROSPLAT_TEXTURECLUSTERS__;__MICROSPLAT_MESHTERRAIN__;__MICROSPLAT_DETAILRESAMPLE__;__MICROSPLAT_TERRAINBLEND__;__MICROSPLAT_TESSELLATION__;__MICROSPLAT_WINDGLITTER__;__MICROSPLAT_LOWPOLY__;__MICROSPLAT_OBJECTSHADER__;__MICROSPLAT_PROCTEX__;__MICROSPLAT_TRIPLANAR__;__MICROSPLAT_MICROVERSEPREVIEW__;UNITY_POST_PROCESSING_STACK_V2;DotSpatial;FANTASY_UNITY;KWS_HD_MODULE_INSTALLED;ODIN_INSPECTOR;ODIN_INSPECTOR_3;ODIN_INSPECTOR_3_1;ODIN_INSPECTOR_3_2;ODIN_INSPECTOR_3_3;KWS_URP;GAIA_INPUT_SYSTEM VisionOS: TextMeshPro;UNITY_VISUAL_SCRIPTING;ES3_TMPRO;ES3_UGUI;ENVIRO_3;ENVIRO_URP;UNITY_POST_PROCESSING_STACK_V2;DotSpatial WebGL: TextMeshPro;UNITY_VISUAL_SCRIPTING;ES3_TMPRO;ES3_UGUI;ENVIRO_3;ENVIRO_URP;UNITY_POST_PROCESSING_STACK_V2;DotSpatial Windows Store Apps: UNITY_VISUAL_SCRIPTING;ES3_TMPRO;ES3_UGUI;DotSpatial diff --git a/UserSettings/EditorUserSettings.asset b/UserSettings/EditorUserSettings.asset index 1b9dc4506..17049aaa0 100644 --- a/UserSettings/EditorUserSettings.asset +++ b/UserSettings/EditorUserSettings.asset @@ -18,26 +18,26 @@ EditorUserSettings: value: 5606515f5605500b0e5c5c2615760a444615487c2a2a2467297d1932b7e4673a flags: 0 RecentlyUsedSceneGuid-3: - value: 0054045155060d5a5c575f7045270d44474f4e7c7f7924637e2a1832b1b5636d - flags: 0 - RecentlyUsedSceneGuid-4: value: 0608045752515c5d54580e7b167306444e4e1a7e2e7b71357c2d4b36e0b9656c flags: 0 - RecentlyUsedSceneGuid-5: + RecentlyUsedSceneGuid-4: value: 00050c5150005f5f54560f2640270d4410161c28282b72357e7c4835e4b63760 flags: 0 - RecentlyUsedSceneGuid-6: + RecentlyUsedSceneGuid-5: value: 5302035e5c530f0b5c0c557416270d44134e4d28787c76332f7e1f6bb1b76169 flags: 0 - RecentlyUsedSceneGuid-7: + RecentlyUsedSceneGuid-6: value: 0508070250545c58585e0924437b5d444f4e4b7f7d7a71627f794c64b2e5633a flags: 0 - RecentlyUsedSceneGuid-8: + RecentlyUsedSceneGuid-7: value: 5309035757065a0a54575f7216265c4444151d28792e72627d2f1935bbb8673a flags: 0 - RecentlyUsedSceneGuid-9: + RecentlyUsedSceneGuid-8: value: 5505015f5c515a085f5b092149760f441716407a787d7564287b1b36e7e1366e flags: 0 + RecentlyUsedSceneGuid-9: + value: 0054045155060d5a5c575f7045270d44474f4e7c7f7924637e2a1832b1b5636d + flags: 0 UnityEditor.ShaderGraph.Blackboard: value: 18135939215a0a5004000b0e15254b524c030a3f2964643d120d1230e9e93a3fd6e826abbd2e2d293c4ead313b08042de6030a0afa240c0d020be94c4ba75e435d8715fa32c70d15d11612dacc11fee5d3c5d1fe9ab1bf968e93e2ffcbc3e7e2f0b3ffe0e8b0be9afeffa9ffff8e85dd8390e2969e8899daa7 flags: 0