From d9456389971b6450cff52c8671b85f3eef471c1a Mon Sep 17 00:00:00 2001 From: "Bob.Song" <605277374@qq.com> Date: Tue, 14 Apr 2026 22:29:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=B1=BC=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/New Terrain 13.asset | Bin 0 -> 557364 bytes Assets/New Terrain 13.asset.meta | 8 +++ Assets/Scripts/Fishing/Rope/Rope.cs | 76 ++++++++++++++++++++------ UserSettings/EditorUserSettings.asset | 28 +++++----- 4 files changed, 80 insertions(+), 32 deletions(-) create mode 100644 Assets/New Terrain 13.asset create mode 100644 Assets/New Terrain 13.asset.meta diff --git a/Assets/New Terrain 13.asset b/Assets/New Terrain 13.asset new file mode 100644 index 0000000000000000000000000000000000000000..aa5a057c14bd116873faf1fc04b1158ccc94c233 GIT binary patch literal 557364 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 z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5ZF^-6s=Dj-ZRojfB*pk1PBlyK!5-N0t5&UAV7cs0RsC7{PrvM2{aQRK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U_&*Aa7OJZK-vIpA PLsj*f6IGRetLlFMm#3PB literal 0 HcmV?d00001 diff --git a/Assets/New Terrain 13.asset.meta b/Assets/New Terrain 13.asset.meta new file mode 100644 index 000000000..71dedac44 --- /dev/null +++ b/Assets/New Terrain 13.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 953400dda9b03df4d967e2e7dd8ef9f8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 15600000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Fishing/Rope/Rope.cs b/Assets/Scripts/Fishing/Rope/Rope.cs index 03a9cf3a8..e4e60a055 100644 --- a/Assets/Scripts/Fishing/Rope/Rope.cs +++ b/Assets/Scripts/Fishing/Rope/Rope.cs @@ -31,6 +31,12 @@ public class Rope : MonoBehaviour [SerializeField, Range(0, 16), Tooltip("主求解后追加的硬长度约束次数。只负责把 poly 拉回到 rest total,不改变可变长度逻辑")] private int hardTightenIterations = 2; + [SerializeField, Range(0, 32), Tooltip("当绳子接近拉直时,按误差自动追加的硬长度约束次数上限")] + private int adaptiveHardTightenMaxIterations = 8; + + [SerializeField, Min(0f), Tooltip("单段允许的最大超长误差;超过时继续追加硬长度约束")] + private float hardConstraintTolerance = 0.0005f; + [Header("Length Control (No Min/Max Clamp)")] [Tooltip("初始总长度(米)。如果为 0,则用 physicsSegmentLen*(minPhysicsNodes-1) 作为初始长度")] [SerializeField, Min(0f)] @@ -211,6 +217,8 @@ public class Rope : MonoBehaviour renderSubdivisionsMoving = Mathf.Max(renderSubdivisionsMoving, 1); iterations = Mathf.Clamp(iterations, 1, 80); hardTightenIterations = Mathf.Clamp(hardTightenIterations, 0, 16); + adaptiveHardTightenMaxIterations = Mathf.Clamp(adaptiveHardTightenMaxIterations, 0, 32); + hardConstraintTolerance = Mathf.Max(0f, hardConstraintTolerance); groundCastDistance = Mathf.Max(groundCastDistance, 0.01f); groundCastHeight = Mathf.Max(groundCastHeight, 0f); lineWidth = Mathf.Max(lineWidth, 0.0001f); @@ -532,6 +540,7 @@ public class Rope : MonoBehaviour } SolveHardDistanceConstraints(hardTightenIterations); + SolveHardDistanceConstraintsAdaptive(); LockAnchorsHard(); if (constrainToGround) @@ -572,16 +581,7 @@ public class Rope : MonoBehaviour EnsureRenderCaches(); int last = _physicsNodes - 1; - - Vector3 s = _startTr.position; - Vector3 e = _endTr.position; - - _pCurr[0] = s; - _pCurr[last] = e; - // _pPrev[0] = s; - // _pPrev[last] = e; - - DrawHighResLine_Fast(); + DrawHighResLine_Fast(_startTr.position, _endTr.position, last); } private void UpdateLengthSmooth() @@ -734,6 +734,21 @@ public class Rope : MonoBehaviour } } + private void SolveHardDistanceConstraintsAdaptive() + { + if (adaptiveHardTightenMaxIterations <= 0 || hardConstraintTolerance <= 0f) + return; + + for (int it = 0; it < adaptiveHardTightenMaxIterations; it++) + { + if (GetMaxPositiveSegmentDelta() <= hardConstraintTolerance) + break; + + LockAnchorsHard(); + SolveDistanceConstraints_HeadOnly_Hard(); + } + } + private void SolveDistanceConstraints_HeadOnly_Hard() { SolveDistanceConstraints_HeadOnly_Bidirectional(1f); @@ -787,6 +802,21 @@ public class Rope : MonoBehaviour } } + private float GetMaxPositiveSegmentDelta() + { + float maxDelta = 0f; + for (int i = 1; i < _physicsNodes; i++) + { + float rest = (i == 1) ? _headRestLen : physicsSegmentLen; + float segLen = Vector3.Distance(_pCurr[i - 1], _pCurr[i]); + float delta = segLen - rest; + if (delta > maxDelta) + maxDelta = delta; + } + + return maxDelta; + } + private void ConstrainToGround() { if (groundMask == 0) return; @@ -938,7 +968,7 @@ public class Rope : MonoBehaviour } } - private void DrawHighResLine_Fast() + private void DrawHighResLine_Fast(Vector3 renderStart, Vector3 renderEnd, int last) { if (_pCurr == null || _physicsNodes < 2) return; @@ -949,7 +979,9 @@ public class Rope : MonoBehaviour if (!smooth) { _lineRenderer.positionCount = _physicsNodes; - _lineRenderer.SetPositions(_pCurr); + for (int i = 0; i <= last; i++) + _rPoints[i] = GetRenderPoint(i, last, renderStart, renderEnd); + _lineRenderer.SetPositions(_rPoints); return; } @@ -964,7 +996,6 @@ public class Rope : MonoBehaviour } int idx = 0; - int last = _physicsNodes - 1; for (int seg = 0; seg < last; seg++) { @@ -975,10 +1006,10 @@ public class Rope : MonoBehaviour int i3 = seg + 2; if (i3 > last) i3 = last; - Vector3 p0 = _pCurr[i0]; - Vector3 p1 = _pCurr[i1]; - Vector3 p2 = _pCurr[i2]; - Vector3 p3 = _pCurr[i3]; + Vector3 p0 = GetRenderPoint(i0, last, renderStart, renderEnd); + Vector3 p1 = GetRenderPoint(i1, last, renderStart, renderEnd); + Vector3 p2 = GetRenderPoint(i2, last, renderStart, renderEnd); + Vector3 p3 = GetRenderPoint(i3, last, renderStart, renderEnd); for (int s = 0; s < subdiv; s++) { @@ -1001,12 +1032,21 @@ public class Rope : MonoBehaviour } } - _rPoints[idx++] = _pCurr[last]; + _rPoints[idx++] = renderEnd; _lineRenderer.positionCount = idx; _lineRenderer.SetPositions(_rPoints); } + private Vector3 GetRenderPoint(int index, int last, Vector3 renderStart, Vector3 renderEnd) + { + if (index <= 0) + return renderStart; + if (index >= last) + return renderEnd; + return _pCurr[index]; + } + private static float ClampMonotonic(float value, float p0, float p1, float p2, float p3) { bool rising = p0 <= p1 && p1 <= p2 && p2 <= p3; diff --git a/UserSettings/EditorUserSettings.asset b/UserSettings/EditorUserSettings.asset index c70116ffe..20fec54ca 100644 --- a/UserSettings/EditorUserSettings.asset +++ b/UserSettings/EditorUserSettings.asset @@ -15,32 +15,32 @@ EditorUserSettings: value: 2550581500 flags: 0 RecentlyUsedSceneGuid-0: - value: 55540305570d0f0e0c5e5e2115710d44174e4e2b7b7e77662f2d1c61b5b06069 - flags: 0 - RecentlyUsedSceneGuid-1: - value: 5452500303515f0a5f5b5a7445775e46401519787c717f677d784860e3b1676c - flags: 0 - RecentlyUsedSceneGuid-2: value: 050402550007590a0f565f2714200c44144e492f2f70753175711f66e0b8303c flags: 0 - RecentlyUsedSceneGuid-3: + RecentlyUsedSceneGuid-1: value: 06070c5f5c075c5e5e085476427a0a44474e1c2f7f7a73362f2d4d36b5b1633d flags: 0 - RecentlyUsedSceneGuid-4: + RecentlyUsedSceneGuid-2: value: 0005505f515750595e5f5f23412507441216497f2d7f24367e711c64b6b86c61 flags: 0 - RecentlyUsedSceneGuid-5: - value: 54070c5452075002590c0871127b5a4443161c2f797176312c2f1e6bb1b4353d - flags: 0 - RecentlyUsedSceneGuid-6: + RecentlyUsedSceneGuid-3: value: 5309035757065a0a54575f7216265c4444151d28792e72627d2f1935bbb8673a flags: 0 - RecentlyUsedSceneGuid-7: + RecentlyUsedSceneGuid-4: value: 00050c5150005f5f54560f2640270d4410161c28282b72357e7c4835e4b63760 flags: 0 - RecentlyUsedSceneGuid-8: + RecentlyUsedSceneGuid-5: value: 06090c5f54015f5a0f085b7b11765d444e4e1e287429773178704561b3b23561 flags: 0 + RecentlyUsedSceneGuid-6: + value: 0257035f51050d090f0f5d734521094414164e797e7a20667d7a4536e0e36461 + flags: 0 + RecentlyUsedSceneGuid-7: + value: 54070c5452075002590c0871127b5a4443161c2f797176312c2f1e6bb1b4353d + flags: 0 + RecentlyUsedSceneGuid-8: + value: 07060c5454040c0a545b547240700a441216417e7f2e7268752c4966b4b0663d + flags: 0 RecentlyUsedSceneGuid-9: value: 5505015f5c515a085f5b092149760f441716407a787d7564287b1b36e7e1366e flags: 0