diff --git a/Assets/ResRaw/Prefabs/Line/FishingLine1.prefab b/Assets/ResRaw/Prefabs/Line/FishingLine1.prefab index d3a7b89e9..ceaa8ef4f 100644 --- a/Assets/ResRaw/Prefabs/Line/FishingLine1.prefab +++ b/Assets/ResRaw/Prefabs/Line/FishingLine1.prefab @@ -219,9 +219,9 @@ GameObject: m_Component: - component: {fileID: 3116177874895914436} - component: {fileID: 1033618195002336566} - - component: {fileID: 9117070148710828175} - component: {fileID: 4152162740525283091} - component: {fileID: 2513762410452133691} + - component: {fileID: 3049258369283796050} m_Layer: 15 m_Name: Bobber m_TagString: Untagged @@ -271,29 +271,6 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 0 m_CollisionDetection: 0 ---- !u!136 &9117070148710828175 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5252216124238432432} - 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: 2 - m_Radius: 0.003 - m_Height: 0.02 - m_Direction: 1 - m_Center: {x: 0, y: 0.03, z: 0} --- !u!114 &4152162740525283091 MonoBehaviour: m_ObjectHideFlags: 0 @@ -373,6 +350,27 @@ MonoBehaviour: invertTiltDirection: 0 rotationLerpSpeed: 8 waterAngularDamping: 999 +--- !u!65 &3049258369283796050 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5252216124238432432} + 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: 0.02, y: 0.02, z: 0.02} + m_Center: {x: 0, y: 0, z: 0} --- !u!1 &5438655829551842420 GameObject: m_ObjectHideFlags: 0 @@ -500,7 +498,7 @@ LineRenderer: m_Curve: - serializedVersion: 3 time: 0 - value: 0.002 + value: 0.001 inSlope: 0 outSlope: 0 tangentMode: 0 @@ -580,8 +578,6 @@ MonoBehaviour: sleepDistanceThreshold: 0.002 stableFramesBeforeSleep: 4 wakeDistanceThreshold: 0.001 - tautSegmentThreshold: 0.002 - tautTransitionRange: 0.03 smoothCorners: 1 minCornerAngle: 12 maxCornerSmoothDistance: 0.03 diff --git a/Assets/Scripts/Fishing/New/View/FishingLine/Feature/FishingBobberFeature.cs b/Assets/Scripts/Fishing/New/View/FishingLine/Feature/FishingBobberFeature.cs index 36cd61a27..538242d30 100644 --- a/Assets/Scripts/Fishing/New/View/FishingLine/Feature/FishingBobberFeature.cs +++ b/Assets/Scripts/Fishing/New/View/FishingLine/Feature/FishingBobberFeature.cs @@ -188,6 +188,7 @@ namespace NBF private bool _waterStateInitialized; private float _defaultAngularDamping; private bool _defaultUseGravity; + private RigidbodyConstraints _defaultConstraints; private float _draftVelocity; private float _currentDraftDepth; @@ -195,6 +196,8 @@ namespace NBF private float _biteOffsetY; private float _biteOffsetYVelocity; + private bool _uprightPoseCached; + private Quaternion _cachedUprightRotation; private Quaternion _uprightReferenceRotation; private Quaternion _targetRotation; @@ -284,8 +287,9 @@ namespace NBF UpdateBiteAnimation(deltaTime); UpdateDraft(deltaTime); - UpdateVerticalPosition(deltaTime); - UpdateRotation(deltaTime); + var nextRotation = CalculateNextRotation(deltaTime); + UpdateVerticalPosition(deltaTime, nextRotation); + ApplyRotation(nextRotation); } #endregion @@ -360,6 +364,7 @@ namespace NBF { _defaultAngularDamping = _rb.angularDamping; _defaultUseGravity = _rb.useGravity; + _defaultConstraints = _rb.constraints; _defaultsCached = true; } @@ -368,12 +373,15 @@ namespace NBF _ySmoothVelocity = 0f; _biteOffsetY = 0f; _biteOffsetYVelocity = 0f; - _targetRotation = transform.rotation; + _targetRotation = _rb.rotation; - if (!_waterStateInitialized) + if (!_uprightPoseCached) { - _uprightReferenceRotation = transform.rotation; + _cachedUprightRotation = _rb.rotation; + _uprightPoseCached = true; } + + _uprightReferenceRotation = _cachedUprightRotation; } private void EnterWaterPresentationMode() @@ -385,8 +393,8 @@ namespace NBF _mode = FishingBobberControlMode.WaterPresentation; _waterStateInitialized = true; - _uprightReferenceRotation = transform.rotation; - _targetRotation = transform.rotation; + _uprightReferenceRotation = _cachedUprightRotation; + _targetRotation = _rb.rotation; _draftVelocity = 0f; _ySmoothVelocity = 0f; _biteOffsetYVelocity = 0f; @@ -394,6 +402,8 @@ namespace NBF _rb.useGravity = false; _rb.angularDamping = waterAngularDamping; + _rb.constraints = _defaultConstraints | RigidbodyConstraints.FreezeRotation; + _rb.angularVelocity = Vector3.zero; } private void ExitWaterPresentationMode() @@ -411,6 +421,7 @@ namespace NBF _rb.useGravity = _defaultUseGravity; _rb.angularDamping = _defaultAngularDamping; + _rb.constraints = _defaultConstraints; } private float GetSubmergeDepth() @@ -442,10 +453,10 @@ namespace NBF deltaTime); } - private void UpdateVerticalPosition(float deltaTime) + private void UpdateVerticalPosition(float deltaTime, Quaternion targetRotation) { - var position = transform.position; - var targetY = waterLevel - _currentDraftDepth - bottomOffsetLocalY + _biteOffsetY; + var position = _rb.position; + var targetY = waterLevel - _currentDraftDepth - GetBottomOffsetWorldY(targetRotation) + _biteOffsetY; if (Mathf.Abs(position.y - targetY) < yDeadZone) { @@ -463,7 +474,7 @@ namespace NBF deltaTime); } - transform.position = position; + _rb.MovePosition(position); var velocity = _rb.linearVelocity; if (Mathf.Abs(velocity.y) > 0f) @@ -473,7 +484,7 @@ namespace NBF } } - private void UpdateRotation(float deltaTime) + private Quaternion CalculateNextRotation(float deltaTime) { var targetTiltAngle = EvaluateTargetTiltAngle(); var signedAngle = invertTiltDirection ? -targetTiltAngle : targetTiltAngle; @@ -481,12 +492,22 @@ namespace NBF _targetRotation = _uprightReferenceRotation * Quaternion.AngleAxis(signedAngle, localAxis); _rb.angularVelocity = Vector3.zero; - transform.rotation = Quaternion.Slerp( - transform.rotation, + return Quaternion.Slerp( + _rb.rotation, _targetRotation, 1f - Mathf.Exp(-Mathf.Max(0.01f, rotationLerpSpeed) * deltaTime)); } + private void ApplyRotation(Quaternion nextRotation) + { + _rb.rotation = nextRotation; + } + + private float GetBottomOffsetWorldY(Quaternion rotation) + { + return (rotation * new Vector3(0f, bottomOffsetLocalY, 0f)).y; + } + private float EvaluateTargetTiltAngle() { if (currentBottomWeight <= lyingWeightThreshold)