提交极限判断

This commit is contained in:
2026-04-08 22:06:28 +08:00
parent 8efb431cb1
commit e0d668e8fb
6 changed files with 1931 additions and 108 deletions

748
Assets/LineRoot.prefab Normal file
View File

@@ -0,0 +1,748 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &91479766348803601
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2258652351737169479}
- component: {fileID: 8145809924423166305}
- component: {fileID: 1467947541314689392}
- component: {fileID: 5226597904622542923}
- component: {fileID: 3311555237946392294}
m_Layer: 0
m_Name: LineRoot
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2258652351737169479
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 91479766348803601}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -0, y: 1, z: -0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 6723299894093031200}
- {fileID: 6351458799753807016}
- {fileID: 8897553716173025276}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &8145809924423166305
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 91479766348803601}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 77af114bb80f3904a83cdeaacd5af508, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::F2RopeLine2.FishingLine.FishingLineTestController
solver: {fileID: 1467947541314689392}
initialFirstSegmentLength: 1.2
minFirstSegmentLength: 0.1
maxFirstSegmentLength: 50
lineAdjustSpeed: 0.5
extendKey: 273
retractKey: 274
--- !u!114 &1467947541314689392
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 91479766348803601}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: dcd0fd8d96f994444b2d8663af6b915d, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::F2RopeLine2.FishingLine.FishingLineSolver
anchorTransform: {fileID: 0}
logicalNodes:
- {fileID: 3579389174949393522}
- {fileID: 2510386467436740679}
- {fileID: 4233893683771612084}
lineRenderer: {fileID: 3311555237946392294}
firstSegmentLength: 1.2
firstSegmentStep: 0.1
jointSolverIterations: 12
jointProjectionDistance: 0.02
jointProjectionAngle: 1
lengthLimitTolerance: 0.02
autoBuildOnStart: 1
--- !u!120 &5226597904622542923
LineRenderer:
serializedVersion: 3
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 91479766348803601}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 0
m_LightProbeUsage: 0
m_ReflectionProbeUsage: 0
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 0}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_Positions:
- {x: 0, y: 2.012, z: 0}
- {x: 1.10369775e-13, y: 1.9120001, z: -9.238828e-14}
- {x: 2.2073923e-13, y: 1.812, z: -1.8477624e-13}
- {x: 3.3111009e-13, y: 1.7120001, z: -2.7716544e-13}
- {x: 4.4147954e-13, y: 1.6120001, z: -3.6955335e-13}
- {x: 5.518494e-13, y: 1.5120001, z: -4.619417e-13}
- {x: 6.622193e-13, y: 1.4120001, z: -5.5433e-13}
- {x: 7.7258924e-13, y: 1.312, z: -6.467184e-13}
- {x: 8.829591e-13, y: 1.212, z: -7.3910675e-13}
- {x: 9.93329e-13, y: 1.112, z: -8.314948e-13}
- {x: 1.1036988e-12, y: 1.0120001, z: -9.238834e-13}
- {x: 1.2140688e-12, y: 0.9120001, z: -1.0162718e-12}
- {x: 1.3244386e-12, y: 0.8120001, z: -1.10866e-12}
- {x: 5.60398e-13, y: 0.62396073, z: -7.782542e-13}
- {x: -2.0364301e-13, y: 0.43592137, z: -4.478483e-13}
- {x: -8.808423e-13, y: 0.26925468, z: -1.5499673e-13}
m_Parameters:
serializedVersion: 3
widthMultiplier: 1
widthCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0.002
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
colorGradient:
serializedVersion: 2
key0: {r: 1, g: 1, b: 1, a: 1}
key1: {r: 1, g: 1, b: 1, a: 1}
key2: {r: 0, g: 0, b: 0, a: 0}
key3: {r: 0, g: 0, b: 0, a: 0}
key4: {r: 0, g: 0, b: 0, a: 0}
key5: {r: 0, g: 0, b: 0, a: 0}
key6: {r: 0, g: 0, b: 0, a: 0}
key7: {r: 0, g: 0, b: 0, a: 0}
ctime0: 0
ctime1: 65535
ctime2: 0
ctime3: 0
ctime4: 0
ctime5: 0
ctime6: 0
ctime7: 0
atime0: 0
atime1: 65535
atime2: 0
atime3: 0
atime4: 0
atime5: 0
atime6: 0
atime7: 0
m_Mode: 0
m_ColorSpace: -1
m_NumColorKeys: 2
m_NumAlphaKeys: 2
numCornerVertices: 0
numCapVertices: 0
alignment: 0
textureMode: 0
textureScale: {x: 1, y: 1}
shadowBias: 0.5
generateLightingData: 0
m_UseWorldSpace: 1
m_Loop: 0
m_ApplyActiveColorSpace: 1
--- !u!114 &3311555237946392294
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 91479766348803601}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 827786ffede4e7b4781c522e8a4ba9d0, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::F2RopeLine2.FishingLine.FishingLineRenderer
solver: {fileID: 1467947541314689392}
lineRenderer: {fileID: 5226597904622542923}
solverIterations: 8
damping: 0.98
gravityScale: 1
simulationStep: 0.0166667
maxDeltaTime: 0.0333333
constrainToWaterSurface: 1
waterSurfaceTransform: {fileID: 0}
waterSurfaceHeight: 0.01
ignoreHeadNodeCount: 1
ignoreTailNodeCount: 1
waterSurfaceFollowSpeed: 12
maxSubStepsPerFrame: 2
sleepVelocityThreshold: 0.001
sleepDistanceThreshold: 0.002
stableFramesBeforeSleep: 4
wakeDistanceThreshold: 0.001
tautSegmentThreshold: 0.002
tautTransitionRange: 0.03
smoothCorners: 1
minCornerAngle: 12
maxCornerSmoothDistance: 0.03
cornerSmoothSubdivisions: 3
drawDebugSamples: 0
debugLogicalSampleColor: {r: 0, g: 1, b: 1, a: 1}
debugVirtualSampleColor: {r: 1, g: 0.55, b: 0.15, a: 1}
debugLogicalSampleRadius: 0.018
debugVirtualSampleRadius: 0.012
--- !u!1 &557589608090734031
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6723299894093031200}
- component: {fileID: 3579389174949393522}
- component: {fileID: 5723695353297987443}
m_Layer: 0
m_Name: Start
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &6723299894093031200
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 557589608090734031}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 1.0120001, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2258652351737169479}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &3579389174949393522
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 557589608090734031}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 610df5569209e4b4997cb2dbf3b94cdc, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::F2RopeLine2.FishingLine.FishingLineNode
nodeType: 0
body: {fileID: 5723695353297987443}
interaction: {fileID: 0}
segmentLengthToNext: 0.5
fixedVirtualNodesToNext: 2
runtimeVirtualNode: 0
runtimeChainIndex: -1
drawDebugGizmo: 1
debugGizmoRadius: 0.03
logicalNodeColor: {r: 0.2, g: 0.9, b: 0.2, a: 1}
virtualNodeColor: {r: 1, g: 0.6, b: 0.1, a: 1}
--- !u!54 &5723695353297987443
Rigidbody:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 557589608090734031}
serializedVersion: 5
m_Mass: 1
m_LinearDamping: 0
m_AngularDamping: 0.05
m_CenterOfMass: {x: 0, y: 0, z: 0}
m_InertiaTensor: {x: 1, y: 1, z: 1}
m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
m_UseGravity: 1
m_IsKinematic: 1
m_Interpolate: 1
m_Constraints: 0
m_CollisionDetection: 2
--- !u!1 &2934937872823224413
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8897553716173025276}
- component: {fileID: 5892147773343321515}
- component: {fileID: 4233893683771612084}
- component: {fileID: 8408021804090298851}
- component: {fileID: 3783315171019821957}
m_Layer: 0
m_Name: End
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8897553716173025276
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2934937872823224413}
serializedVersion: 2
m_LocalRotation: {x: -0.00006560718, y: -0.0000073850256, z: -0.0000878417, w: 1}
m_LocalPosition: {x: -8.808423e-13, y: -0.7307453, z: -1.5499673e-13}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2258652351737169479}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!54 &5892147773343321515
Rigidbody:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2934937872823224413}
serializedVersion: 5
m_Mass: 1
m_LinearDamping: 0
m_AngularDamping: 0.05
m_CenterOfMass: {x: 0, y: 0, z: 0}
m_InertiaTensor: {x: 1, y: 1, z: 1}
m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
m_UseGravity: 1
m_IsKinematic: 0
m_Interpolate: 1
m_Constraints: 0
m_CollisionDetection: 2
--- !u!114 &4233893683771612084
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2934937872823224413}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 610df5569209e4b4997cb2dbf3b94cdc, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::F2RopeLine2.FishingLine.FishingLineNode
nodeType: 3
body: {fileID: 5892147773343321515}
interaction: {fileID: 0}
segmentLengthToNext: 0.5
fixedVirtualNodesToNext: 2
runtimeVirtualNode: 0
runtimeChainIndex: -1
drawDebugGizmo: 1
debugGizmoRadius: 0.03
logicalNodeColor: {r: 0.2, g: 0.9, b: 0.2, a: 1}
virtualNodeColor: {r: 1, g: 0.6, b: 0.1, a: 1}
--- !u!65 &8408021804090298851
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2934937872823224413}
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!153 &3783315171019821957
ConfigurableJoint:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2934937872823224413}
serializedVersion: 4
m_ConnectedBody: {fileID: 1821920303142153024}
m_ConnectedArticulationBody: {fileID: 0}
m_Anchor: {x: 0, y: 0, z: 0}
m_Axis: {x: 1, y: 0, z: 0}
m_AutoConfigureConnectedAnchor: 1
m_ConnectedAnchor: {x: 0, y: 0, z: 0}
m_SecondaryAxis: {x: 0, y: 1, z: 0}
m_XMotion: 1
m_YMotion: 1
m_ZMotion: 1
m_AngularXMotion: 2
m_AngularYMotion: 2
m_AngularZMotion: 2
m_LinearLimitSpring:
spring: 0
damper: 0
m_LinearLimit:
limit: 0.5
bounciness: 0
contactDistance: 0
m_AngularXLimitSpring:
spring: 0
damper: 0
m_LowAngularXLimit:
limit: 0
bounciness: 0
contactDistance: 0
m_HighAngularXLimit:
limit: 0
bounciness: 0
contactDistance: 0
m_AngularYZLimitSpring:
spring: 0
damper: 0
m_AngularYLimit:
limit: 0
bounciness: 0
contactDistance: 0
m_AngularZLimit:
limit: 0
bounciness: 0
contactDistance: 0
m_TargetPosition: {x: 0, y: 0, z: 0}
m_TargetVelocity: {x: 0, y: 0, z: 0}
m_XDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_YDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_ZDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_TargetRotation: {x: 0, y: 0, z: 0, w: 1}
m_TargetAngularVelocity: {x: 0, y: 0, z: 0}
m_RotationDriveMode: 0
m_AngularXDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_AngularYZDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_SlerpDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_ProjectionMode: 1
m_ProjectionDistance: 0.02
m_ProjectionAngle: 1
m_ConfiguredInWorldSpace: 0
m_SwapBodies: 0
m_BreakForce: Infinity
m_BreakTorque: Infinity
m_EnableCollision: 0
m_EnablePreprocessing: 1
m_MassScale: 1
m_ConnectedMassScale: 1
--- !u!1 &8846185197365154463
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6351458799753807016}
- component: {fileID: 1821920303142153024}
- component: {fileID: 2510386467436740679}
- component: {fileID: 6269782168754981410}
- component: {fileID: 8935316774750517628}
m_Layer: 0
m_Name: Float
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &6351458799753807016
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8846185197365154463}
serializedVersion: 2
m_LocalRotation: {x: 0.000016194257, y: -0.00000094081116, z: -0.0000045387405, w: 1}
m_LocalPosition: {x: 1.3244386e-12, y: -0.1879999, z: -1.10866e-12}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2258652351737169479}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!54 &1821920303142153024
Rigidbody:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8846185197365154463}
serializedVersion: 5
m_Mass: 1
m_LinearDamping: 11
m_AngularDamping: 11111
m_CenterOfMass: {x: 0, y: 0, z: 0}
m_InertiaTensor: {x: 1, y: 1, z: 1}
m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
m_UseGravity: 1
m_IsKinematic: 0
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 1
--- !u!114 &2510386467436740679
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8846185197365154463}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 610df5569209e4b4997cb2dbf3b94cdc, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::F2RopeLine2.FishingLine.FishingLineNode
nodeType: 1
body: {fileID: 1821920303142153024}
interaction: {fileID: 0}
segmentLengthToNext: 0.5
fixedVirtualNodesToNext: 2
runtimeVirtualNode: 0
runtimeChainIndex: -1
drawDebugGizmo: 1
debugGizmoRadius: 0.03
logicalNodeColor: {r: 0.2, g: 0.9, b: 0.2, a: 1}
virtualNodeColor: {r: 1, g: 0.6, b: 0.1, a: 1}
--- !u!65 &6269782168754981410
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8846185197365154463}
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!153 &8935316774750517628
ConfigurableJoint:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8846185197365154463}
serializedVersion: 4
m_ConnectedBody: {fileID: 5723695353297987443}
m_ConnectedArticulationBody: {fileID: 0}
m_Anchor: {x: 0, y: 0, z: 0}
m_Axis: {x: 1, y: 0, z: 0}
m_AutoConfigureConnectedAnchor: 1
m_ConnectedAnchor: {x: 0, y: 0, z: 0}
m_SecondaryAxis: {x: 0, y: 1, z: 0}
m_XMotion: 1
m_YMotion: 1
m_ZMotion: 1
m_AngularXMotion: 2
m_AngularYMotion: 2
m_AngularZMotion: 2
m_LinearLimitSpring:
spring: 0
damper: 0
m_LinearLimit:
limit: 1.2
bounciness: 0
contactDistance: 0
m_AngularXLimitSpring:
spring: 0
damper: 0
m_LowAngularXLimit:
limit: 0
bounciness: 0
contactDistance: 0
m_HighAngularXLimit:
limit: 0
bounciness: 0
contactDistance: 0
m_AngularYZLimitSpring:
spring: 0
damper: 0
m_AngularYLimit:
limit: 0
bounciness: 0
contactDistance: 0
m_AngularZLimit:
limit: 0
bounciness: 0
contactDistance: 0
m_TargetPosition: {x: 0, y: 0, z: 0}
m_TargetVelocity: {x: 0, y: 0, z: 0}
m_XDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_YDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_ZDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_TargetRotation: {x: 0, y: 0, z: 0, w: 1}
m_TargetAngularVelocity: {x: 0, y: 0, z: 0}
m_RotationDriveMode: 0
m_AngularXDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_AngularYZDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_SlerpDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_ProjectionMode: 0
m_ProjectionDistance: 0
m_ProjectionAngle: 1
m_ConfiguredInWorldSpace: 0
m_SwapBodies: 0
m_BreakForce: Infinity
m_BreakTorque: Infinity
m_EnableCollision: 0
m_EnablePreprocessing: 0
m_MassScale: 1
m_ConnectedMassScale: 1

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: da77dabd97d06da46a6c7c954a1f7b46
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -119,6 +119,11 @@ NavMeshSettings:
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!4 &237607922 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 6723299894093031200, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
m_PrefabInstance: {fileID: 1013111638}
m_PrefabAsset: {fileID: 0}
--- !u!1 &330585543
GameObject:
m_ObjectHideFlags: 0
@@ -383,6 +388,361 @@ MonoBehaviour:
m_ShadowLayerMask: 1
m_RenderingLayers: 1
m_ShadowRenderingLayers: 1
--- !u!1 &423389168
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 423389169}
- component: {fileID: 423389172}
- component: {fileID: 423389171}
- component: {fileID: 423389170}
m_Layer: 0
m_Name: Cube
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &423389169
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 423389168}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.1, y: 0.1, z: 0.1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 237607922}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!65 &423389170
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 423389168}
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: 1, y: 1, z: 1}
m_Center: {x: 0, y: 0, z: 0}
--- !u!23 &423389171
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 423389168}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &423389172
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 423389168}
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
--- !u!1 &491872094
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 491872100}
- component: {fileID: 491872099}
- component: {fileID: 491872098}
- component: {fileID: 491872097}
- component: {fileID: 491872096}
- component: {fileID: 491872095}
m_Layer: 0
m_Name: EndTime
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!153 &491872095
ConfigurableJoint:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 491872094}
serializedVersion: 4
m_ConnectedBody: {fileID: 625757862}
m_ConnectedArticulationBody: {fileID: 0}
m_Anchor: {x: 0, y: 0.5, z: 0}
m_Axis: {x: 1, y: 0, z: 0}
m_AutoConfigureConnectedAnchor: 1
m_ConnectedAnchor: {x: 0, y: 0, z: 0}
m_SecondaryAxis: {x: 0, y: 1, z: 0}
m_XMotion: 2
m_YMotion: 2
m_ZMotion: 2
m_AngularXMotion: 2
m_AngularYMotion: 2
m_AngularZMotion: 2
m_LinearLimitSpring:
spring: 0
damper: 0
m_LinearLimit:
limit: 1
bounciness: 0
contactDistance: 0
m_AngularXLimitSpring:
spring: 0
damper: 0
m_LowAngularXLimit:
limit: 0
bounciness: 0
contactDistance: 0
m_HighAngularXLimit:
limit: 0
bounciness: 0
contactDistance: 0
m_AngularYZLimitSpring:
spring: 0
damper: 0
m_AngularYLimit:
limit: 0
bounciness: 0
contactDistance: 0
m_AngularZLimit:
limit: 0
bounciness: 0
contactDistance: 0
m_TargetPosition: {x: 0, y: 0, z: 0}
m_TargetVelocity: {x: 0, y: 0, z: 0}
m_XDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_YDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_ZDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_TargetRotation: {x: 0, y: 0, z: 0, w: 1}
m_TargetAngularVelocity: {x: 0, y: 0, z: 0}
m_RotationDriveMode: 0
m_AngularXDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_AngularYZDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_SlerpDrive:
serializedVersion: 4
positionSpring: 0
positionDamper: 0
maximumForce: 3.4028233e+38
useAcceleration: 0
m_ProjectionMode: 0
m_ProjectionDistance: 0.1
m_ProjectionAngle: 180
m_ConfiguredInWorldSpace: 0
m_SwapBodies: 0
m_BreakForce: Infinity
m_BreakTorque: Infinity
m_EnableCollision: 0
m_EnablePreprocessing: 1
m_MassScale: 1
m_ConnectedMassScale: 1
--- !u!54 &491872096
Rigidbody:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 491872094}
serializedVersion: 5
m_Mass: 1
m_LinearDamping: 0
m_AngularDamping: 0.05
m_CenterOfMass: {x: 0, y: 0, z: 0}
m_InertiaTensor: {x: 1, y: 1, z: 1}
m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
m_UseGravity: 1
m_IsKinematic: 0
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0
--- !u!135 &491872097
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 491872094}
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_Radius: 0.5
m_Center: {x: 0, y: 0, z: 0}
--- !u!23 &491872098
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 491872094}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &491872099
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 491872094}
m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
--- !u!4 &491872100
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 491872094}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.15761, y: 0.216, z: -0.14555}
m_LocalScale: {x: 0.1, y: 0.1, z: 0.1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &603012223
GameObject:
m_ObjectHideFlags: 0
@@ -444,13 +804,8 @@ MonoBehaviour:
jointSolverIterations: 12
jointProjectionDistance: 0.02
jointProjectionAngle: 1
lengthLimitTolerance: 0.02
autoBuildOnStart: 1
drawDebugChain: 1
debugColor: {r: 0, g: 1, b: 1, a: 1}
debugLengthColor: {r: 1, g: 0.92156863, b: 0.015686275, a: 1}
debugNodeRadius: 0.025
showNodeLabels: 1
showSegmentLabels: 1
--- !u!114 &603012226
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -482,13 +837,16 @@ MonoBehaviour:
stableFramesBeforeSleep: 4
wakeDistanceThreshold: 0.001
tautSegmentThreshold: 0.002
tautTransitionRange: 0.03
smoothCorners: 1
minCornerAngle: 12
maxCornerSmoothDistance: 0.03
cornerSmoothSubdivisions: 3
drawDebugSamples: 0
debugSampleColor: {r: 1, g: 0.2, b: 0.2, a: 1}
debugSampleRadius: 0.015
debugLogicalSampleColor: {r: 0, g: 1, b: 1, a: 1}
debugVirtualSampleColor: {r: 1, g: 0.55, b: 0.15, a: 1}
debugLogicalSampleRadius: 0.018
debugVirtualSampleRadius: 0.012
--- !u!120 &603012227
LineRenderer:
serializedVersion: 3
@@ -615,9 +973,154 @@ MonoBehaviour:
initialFirstSegmentLength: 1.2
minFirstSegmentLength: 0.1
maxFirstSegmentLength: 50
lineAdjustSpeed: 1
lineAdjustSpeed: 0.5
extendKey: 273
retractKey: 274
--- !u!4 &616258654 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 6351458799753807016, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
m_PrefabInstance: {fileID: 1013111638}
m_PrefabAsset: {fileID: 0}
--- !u!1 &625757861
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 625757866}
- component: {fileID: 625757865}
- component: {fileID: 625757864}
- component: {fileID: 625757863}
- component: {fileID: 625757862}
m_Layer: 0
m_Name: TipTest
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!54 &625757862
Rigidbody:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 625757861}
serializedVersion: 5
m_Mass: 1
m_LinearDamping: 0
m_AngularDamping: 0.05
m_CenterOfMass: {x: 0, y: 0, z: 0}
m_InertiaTensor: {x: 1, y: 1, z: 1}
m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
m_UseGravity: 0
m_IsKinematic: 1
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0
--- !u!135 &625757863
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 625757861}
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_Radius: 0.5
m_Center: {x: 0, y: 0, z: 0}
--- !u!23 &625757864
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 625757861}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &625757865
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 625757861}
m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
--- !u!4 &625757866
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 625757861}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.15761, y: 0.45164, z: -0.14555}
m_LocalScale: {x: 0.1, y: 0.1, z: 0.1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &832575517
GameObject:
m_ObjectHideFlags: 0
@@ -667,6 +1170,203 @@ Transform:
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &915051044
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 915051045}
- component: {fileID: 915051048}
- component: {fileID: 915051047}
- component: {fileID: 915051046}
m_Layer: 0
m_Name: Cube
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &915051045
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 915051044}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.1, y: 0.1, z: 0.1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 616258654}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!65 &915051046
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 915051044}
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: 1, y: 1, z: 1}
m_Center: {x: 0, y: 0, z: 0}
--- !u!23 &915051047
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 915051044}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &915051048
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 915051044}
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
--- !u!1001 &1013111638
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 91479766348803601, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
propertyPath: m_Name
value: LineRootTest
objectReference: {fileID: 0}
- target: {fileID: 91479766348803601, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
propertyPath: m_IsActive
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2258652351737169479, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
propertyPath: m_LocalPosition.x
value: 0.32473
objectReference: {fileID: 0}
- target: {fileID: 2258652351737169479, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
propertyPath: m_LocalPosition.y
value: -0.00001
objectReference: {fileID: 0}
- target: {fileID: 2258652351737169479, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
propertyPath: m_LocalPosition.z
value: 1.00763
objectReference: {fileID: 0}
- target: {fileID: 2258652351737169479, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2258652351737169479, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2258652351737169479, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2258652351737169479, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2258652351737169479, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2258652351737169479, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2258652351737169479, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3311555237946392294, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
propertyPath: solver
value:
objectReference: {fileID: 0}
- target: {fileID: 8145809924423166305, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
propertyPath: m_Enabled
value: 0
objectReference: {fileID: 0}
m_RemovedComponents:
- {fileID: 8145809924423166305, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
- {fileID: 1467947541314689392, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
- {fileID: 3311555237946392294, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
- {fileID: 5226597904622542923, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
- {fileID: 3579389174949393522, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
- {fileID: 2510386467436740679, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
- {fileID: 4233893683771612084, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
m_RemovedGameObjects: []
m_AddedGameObjects:
- targetCorrespondingSourceObject: {fileID: 6723299894093031200, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
insertIndex: -1
addedObject: {fileID: 423389169}
- targetCorrespondingSourceObject: {fileID: 6351458799753807016, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
insertIndex: -1
addedObject: {fileID: 915051045}
- targetCorrespondingSourceObject: {fileID: 8897553716173025276, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
insertIndex: -1
addedObject: {fileID: 1928973612}
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
--- !u!1 &1265290371
GameObject:
m_ObjectHideFlags: 0
@@ -744,8 +1444,8 @@ Rigidbody:
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
m_ImplicitCom: 0
m_ImplicitTensor: 0
m_UseGravity: 1
m_IsKinematic: 0
m_Interpolate: 0
@@ -770,7 +1470,7 @@ BoxCollider:
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 0.1, y: 0.1, z: 0.1}
m_Size: {x: 0.02, y: 0.02, z: 0.02}
m_Center: {x: 0, y: 0, z: 0}
--- !u!1 &1470501307
GameObject:
@@ -837,7 +1537,7 @@ Rigidbody:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1470501307}
serializedVersion: 5
m_Mass: 1
m_Mass: 0.1
m_LinearDamping: 0
m_AngularDamping: 0.05
m_CenterOfMass: {x: 0, y: 0, z: 0}
@@ -849,8 +1549,8 @@ Rigidbody:
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
m_ImplicitCom: 0
m_ImplicitTensor: 0
m_UseGravity: 1
m_IsKinematic: 0
m_Interpolate: 0
@@ -875,8 +1575,13 @@ BoxCollider:
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 0.1, y: 0.1, z: 0.1}
m_Size: {x: 0.02, y: 0.02, z: 0.02}
m_Center: {x: 0, y: 0, z: 0}
--- !u!4 &1480698140 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 8897553716173025276, guid: da77dabd97d06da46a6c7c954a1f7b46, type: 3}
m_PrefabInstance: {fileID: 1013111638}
m_PrefabAsset: {fileID: 0}
--- !u!1 &1769698868
GameObject:
m_ObjectHideFlags: 0
@@ -960,6 +1665,118 @@ MonoBehaviour:
debugGizmoRadius: 0.03
logicalNodeColor: {r: 0.2, g: 0.9, b: 0.2, a: 1}
virtualNodeColor: {r: 1, g: 0.6, b: 0.1, a: 1}
--- !u!1 &1928973611
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1928973612}
- component: {fileID: 1928973615}
- component: {fileID: 1928973614}
- component: {fileID: 1928973613}
m_Layer: 0
m_Name: Cube (1)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1928973612
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1928973611}
serializedVersion: 2
m_LocalRotation: {x: 0.00008180148, y: 0.0000064459346, z: 0.00008330278, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.1, y: 0.1, z: 0.1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1480698140}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!65 &1928973613
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1928973611}
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: 1, y: 1, z: 1}
m_Center: {x: 0, y: 0, z: 0}
--- !u!23 &1928973614
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1928973611}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &1928973615
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1928973611}
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
--- !u!1 &1939106081
GameObject:
m_ObjectHideFlags: 0
@@ -1094,3 +1911,6 @@ SceneRoots:
- {fileID: 2003292182}
- {fileID: 603012224}
- {fileID: 1939106084}
- {fileID: 625757866}
- {fileID: 491872100}
- {fileID: 1013111638}

View File

@@ -46,6 +46,8 @@ namespace F2RopeLine2.FishingLine
[SerializeField] private float wakeDistanceThreshold = 0.001f;
[Min(0f)]
[SerializeField] private float tautSegmentThreshold = 0.002f;
[Min(0.001f)]
[SerializeField] private float tautTransitionRange = 0.03f;
[Header("Corner Smoothing")]
[SerializeField] private bool smoothCorners = true;
@@ -58,9 +60,12 @@ namespace F2RopeLine2.FishingLine
[Header("Debug")]
[SerializeField] private bool drawDebugSamples;
[SerializeField] private Color debugSampleColor = new(1f, 0.2f, 0.2f, 1f);
[SerializeField] private Color debugLogicalSampleColor = Color.cyan;
[SerializeField] private Color debugVirtualSampleColor = new(1f, 0.55f, 0.15f, 1f);
[Min(0.001f)]
[SerializeField] private float debugSampleRadius = 0.015f;
[SerializeField] private float debugLogicalSampleRadius = 0.018f;
[Min(0.001f)]
[SerializeField] private float debugVirtualSampleRadius = 0.012f;
private readonly List<Vector3> positions = new();
private readonly List<Vector3> renderPositions = new();
@@ -253,6 +258,7 @@ namespace F2RopeLine2.FishingLine
ApplyWaterSurfaceConstraint(stepDelta);
SolveDistanceConstraints(points, restLengths);
StraightenTautLogicalSegments(points, restLengths);
SolveDistanceConstraints(points, restLengths);
PinLogicalPoints(points);
ApplySleep();
}
@@ -382,19 +388,32 @@ namespace F2RopeLine2.FishingLine
var end = positions[endIndex];
var delta = end - start;
var endpointDistance = delta.magnitude;
if (endpointDistance <= 0.0001f || endpointDistance + tautSegmentThreshold < segmentRestLength)
if (endpointDistance <= 0.0001f)
{
return;
}
var fullTautDistance = Mathf.Max(0f, segmentRestLength - tautSegmentThreshold);
var blendStartDistance = Mathf.Max(0f, fullTautDistance - tautTransitionRange);
if (endpointDistance < blendStartDistance)
{
return;
}
var straightenBlend = blendStartDistance >= fullTautDistance
? 1f
: Mathf.SmoothStep(0f, 1f, Mathf.InverseLerp(blendStartDistance, fullTautDistance, endpointDistance));
var direction = delta / endpointDistance;
var accumulatedDistance = 0f;
for (var pointIndex = startIndex + 1; pointIndex < endIndex; pointIndex++)
{
accumulatedDistance += restLengths[pointIndex - 1];
var projectedPosition = start + direction * accumulatedDistance;
positions[pointIndex] = projectedPosition;
previousPositions[pointIndex] = projectedPosition;
var currentPosition = positions[pointIndex];
var blendedPosition = Vector3.Lerp(currentPosition, projectedPosition, straightenBlend);
positions[pointIndex] = blendedPosition;
previousPositions[pointIndex] = Vector3.Lerp(previousPositions[pointIndex], blendedPosition, straightenBlend);
}
}
@@ -681,10 +700,17 @@ namespace F2RopeLine2.FishingLine
return;
}
Gizmos.color = debugSampleColor;
for (var i = 0; i < positions.Count; i++)
{
Gizmos.DrawSphere(positions[i], debugSampleRadius);
var isLogicalPoint = solver != null
&& solver.ChainPoints != null
&& i < solver.ChainPoints.Count
&& solver.ChainPoints[i].IsLogical;
Gizmos.color = isLogicalPoint ? debugLogicalSampleColor : debugVirtualSampleColor;
Gizmos.DrawSphere(
positions[i],
isLogicalPoint ? debugLogicalSampleRadius : debugVirtualSampleRadius);
}
}
}

View File

@@ -53,16 +53,14 @@ namespace F2RopeLine2.FishingLine
[SerializeField] private float jointProjectionDistance = 0.02f;
[SerializeField] private float jointProjectionAngle = 1f;
[Header("Limit Detection")]
[Min(0f)]
// 极限判定的长度容差,允许链路在总长或单段长度上存在少量误差。
[SerializeField] private float lengthLimitTolerance = 0.02f;
[Header("Runtime Debug")]
[SerializeField] private bool autoBuildOnStart = true;
[SerializeField] private bool drawDebugChain = true;
[SerializeField] private Color debugColor = Color.cyan;
[SerializeField] private Color debugLengthColor = Color.yellow;
[Min(0.001f)]
[SerializeField] private float debugNodeRadius = 0.025f;
[SerializeField] private bool showNodeLabels = true;
[SerializeField] private bool showSegmentLabels = true;
private readonly List<ChainPoint> chainPoints = new();
private readonly List<float> restLengths = new();
private readonly List<int> pinnedIndices = new();
@@ -81,8 +79,61 @@ namespace F2RopeLine2.FishingLine
public IReadOnlyList<int> PinnedIndices => pinnedIndices;
/// <summary>
/// 当前配置的逻辑节点只读列表。
/// 外部可读取节点顺序,但不应直接修改数组内容。
/// </summary>
public IReadOnlyList<FishingLineNode> LogicalNodes => logicalNodes;
/// <summary>
/// 当前整条鱼线的配置总长度,等于所有段的静止长度之和。
/// </summary>
public float TotalLineLength { get; private set; }
/// <summary>
/// 当前逻辑节点链路的实际总长度,按相邻逻辑节点的实际距离累加。
/// </summary>
public float CurrentLogicalChainLength { get; private set; }
/// <summary>
/// 当前首尾逻辑节点之间的直线距离,仅作为端点跨度观察值。
/// </summary>
public float CurrentEndpointDistance { get; private set; }
/// <summary>
/// 当前逻辑链总长度超出配置总长度的部分,小于等于零时记为 0。
/// </summary>
public float CurrentStretchLength { get; private set; }
/// <summary>
/// 当前所有逻辑段中,单段超出配置长度的最大值。
/// </summary>
public float MaxSegmentStretchLength { get; private set; }
/// <summary>
/// 当前超限最明显的逻辑段索引;为 -1 表示没有段处于超限。
/// </summary>
public int MaxOverstretchedSegmentIndex { get; private set; } = -1;
/// <summary>
/// 当前受拉比例。
/// 该值取“单段实际长度 / 单段配置长度”和“整链实际长度 / 整链配置长度”中的最大值。
/// 约等于 1 表示接近拉直,大于 1 表示已经出现超限拉伸。
/// </summary>
public float CurrentTensionRatio { get; private set; }
/// <summary>
/// 当前是否处于极限状态。
/// 只要整链超出总长度容差,或任一逻辑段超出单段容差,即认为到达极限。
/// </summary>
public bool IsAtLimit { get; private set; }
/// <summary>
/// 当前连续处于极限状态的累计时间,退出极限时会重置为 0。
/// 可用于上层决定是否触发切线。
/// </summary>
public float LimitStateTime { get; private set; }
public int LogicalNodeCount => logicalNodes?.Length ?? 0;
public int RuntimeVirtualNodeCount => runtimeVirtualPointCount;
@@ -115,6 +166,7 @@ namespace F2RopeLine2.FishingLine
{
if (logicalNodes == null || logicalNodes.Length == 0)
{
ResetLimitState();
return;
}
@@ -124,6 +176,8 @@ namespace F2RopeLine2.FishingLine
{
RebuildRuntimeChain();
}
EvaluateLimitState(Time.fixedDeltaTime);
}
private void LateUpdate()
@@ -146,17 +200,26 @@ namespace F2RopeLine2.FishingLine
firstSegmentLength = Mathf.Max(0f, firstSegmentLength);
firstSegmentStep = Mathf.Max(0.001f, firstSegmentStep);
jointSolverIterations = Mathf.Max(1, jointSolverIterations);
lengthLimitTolerance = Mathf.Max(0f, lengthLimitTolerance);
chainDirty = true;
}
/// <summary>
/// 按当前配置重建整条鱼线的运行时链路,并立即刷新极限状态。
/// </summary>
[ContextMenu("Build Line")]
public void BuildLine()
{
ConfigureStartNode();
ConfigureLogicalJoints();
RebuildRuntimeChain();
EvaluateLimitState(0f);
}
/// <summary>
/// 设置指定逻辑段的配置长度。
/// segmentIndex 为 0 时表示第一段;大于 0 时表示对应逻辑节点到下一个逻辑节点的线长。
/// </summary>
public void SetLenght(float length, int segmentIndex = 0)
{
var clamped = Mathf.Max(0f, length);
@@ -190,11 +253,60 @@ namespace F2RopeLine2.FishingLine
chainDirty = true;
}
/// <summary>
/// 立即按当前配置重建鱼线。
/// </summary>
public void RebuildNow()
{
BuildLine();
}
/// <summary>
/// 获取指定顺序索引的逻辑节点。
/// 索引基于 logicalNodes 配置顺序;超出范围或节点为空时返回 null。
/// </summary>
public FishingLineNode GetLogicalNode(int logicalIndex)
{
if (logicalNodes == null || logicalIndex < 0 || logicalIndex >= logicalNodes.Length)
{
return null;
}
return logicalNodes[logicalIndex];
}
/// <summary>
/// 尝试获取指定顺序索引的逻辑节点。
/// 获取失败时返回 false并将 node 置为 null。
/// </summary>
public bool TryGetLogicalNode(int logicalIndex, out FishingLineNode node)
{
node = GetLogicalNode(logicalIndex);
return node != null;
}
/// <summary>
/// 获取当前起点逻辑节点。
/// 会返回配置顺序中第一个非空节点。
/// </summary>
public FishingLineNode GetStartNode()
{
return FindFirstValidLogicalNode();
}
/// <summary>
/// 获取当前终点逻辑节点。
/// 会返回配置顺序中最后一个非空节点。
/// </summary>
public FishingLineNode GetEndNode()
{
return FindLastValidLogicalNode();
}
/// <summary>
/// 获取当前运行时链路中相邻采样点的实际距离。
/// 这里的采样点包含逻辑节点和虚拟节点。
/// </summary>
public float GetActualDistance(int segmentIndex)
{
if (segmentIndex < 0 || segmentIndex >= chainPoints.Count - 1)
@@ -205,6 +317,9 @@ namespace F2RopeLine2.FishingLine
return Vector3.Distance(chainPoints[segmentIndex].Position, chainPoints[segmentIndex + 1].Position);
}
/// <summary>
/// 返回当前鱼线运行时调试摘要,包含链路结构、长度和极限状态信息。
/// </summary>
public string GetRuntimeDebugSummary()
{
var builder = new StringBuilder(512);
@@ -218,7 +333,17 @@ namespace F2RopeLine2.FishingLine
.Append(OrderedNodeCount)
.Append(" total:")
.Append(TotalLineLength.ToString("F2"))
.Append("m");
.Append("m")
.Append(" chain:")
.Append(CurrentLogicalChainLength.ToString("F2"))
.Append("m")
.Append(" tension:")
.Append(CurrentTensionRatio.ToString("F3"))
.Append(" limit:")
.Append(IsAtLimit ? "yes" : "no")
.Append(" limitTime:")
.Append(LimitStateTime.ToString("F2"))
.Append("s");
for (var i = 0; i < chainPoints.Count; i++)
{
@@ -329,11 +454,116 @@ namespace F2RopeLine2.FishingLine
if (startNode.Body != null)
{
startNode.Body.linearVelocity = Vector3.zero;
startNode.Body.angularVelocity = Vector3.zero;
if (!startNode.Body.isKinematic)
{
startNode.Body.linearVelocity = Vector3.zero;
startNode.Body.angularVelocity = Vector3.zero;
}
}
}
private void EvaluateLimitState(float deltaTime)
{
CurrentLogicalChainLength = 0f;
CurrentEndpointDistance = 0f;
CurrentStretchLength = 0f;
MaxSegmentStretchLength = 0f;
MaxOverstretchedSegmentIndex = -1;
CurrentTensionRatio = 0f;
if (logicalNodes == null || logicalNodes.Length < 2)
{
SetLimitState(false, deltaTime);
return;
}
FishingLineNode firstNode = null;
FishingLineNode lastNode = null;
for (var segmentIndex = 0; segmentIndex < logicalNodes.Length; segmentIndex++)
{
var node = logicalNodes[segmentIndex];
if (node == null)
{
continue;
}
firstNode ??= node;
lastNode = node;
if (segmentIndex >= logicalNodes.Length - 1)
{
continue;
}
var nextNode = logicalNodes[segmentIndex + 1];
if (nextNode == null)
{
continue;
}
var actualDistance = Vector3.Distance(node.Position, nextNode.Position);
var configuredLength = GetSegmentLength(segmentIndex);
CurrentLogicalChainLength += actualDistance;
if (configuredLength > 0.0001f)
{
CurrentTensionRatio = Mathf.Max(CurrentTensionRatio, actualDistance / configuredLength);
}
var segmentStretchLength = Mathf.Max(0f, actualDistance - configuredLength);
if (segmentStretchLength > MaxSegmentStretchLength)
{
MaxSegmentStretchLength = segmentStretchLength;
MaxOverstretchedSegmentIndex = segmentStretchLength > 0f ? segmentIndex : -1;
}
}
if (firstNode != null && lastNode != null && !ReferenceEquals(firstNode, lastNode))
{
CurrentEndpointDistance = Vector3.Distance(firstNode.Position, lastNode.Position);
}
if (TotalLineLength > 0.0001f)
{
CurrentStretchLength = Mathf.Max(0f, CurrentLogicalChainLength - TotalLineLength);
CurrentTensionRatio = Mathf.Max(CurrentTensionRatio, CurrentLogicalChainLength / TotalLineLength);
}
else if (CurrentLogicalChainLength > 0f)
{
CurrentStretchLength = CurrentLogicalChainLength;
CurrentTensionRatio = Mathf.Max(CurrentTensionRatio, 1f);
}
var exceedsTotalLength = CurrentStretchLength > lengthLimitTolerance;
var exceedsSegmentLength = MaxSegmentStretchLength > lengthLimitTolerance;
SetLimitState(exceedsTotalLength || exceedsSegmentLength, deltaTime);
}
private void SetLimitState(bool isAtLimit, float deltaTime)
{
IsAtLimit = isAtLimit;
if (IsAtLimit)
{
LimitStateTime += Mathf.Max(0f, deltaTime);
return;
}
LimitStateTime = 0f;
}
private void ResetLimitState()
{
CurrentLogicalChainLength = 0f;
CurrentEndpointDistance = 0f;
CurrentStretchLength = 0f;
MaxSegmentStretchLength = 0f;
MaxOverstretchedSegmentIndex = -1;
CurrentTensionRatio = 0f;
IsAtLimit = false;
LimitStateTime = 0f;
}
private void RebuildRuntimeChain()
{
chainPoints.Clear();
@@ -507,14 +737,7 @@ namespace F2RopeLine2.FishingLine
return divisibleGaps;
}
private void UpdateJointLimitsFromConfig()
{
for (var i = 1; i < logicalNodes.Length; i++)
{
UpdateJointLimit(i, GetSegmentLength(i - 1));
}
}
private void UpdateJointLimit(int logicalNodeIndex, float limitValue)
{
@@ -556,6 +779,42 @@ namespace F2RopeLine2.FishingLine
return sourceNode != null ? sourceNode.SegmentLengthToNext : 0f;
}
private FishingLineNode FindFirstValidLogicalNode()
{
if (logicalNodes == null)
{
return null;
}
for (var i = 0; i < logicalNodes.Length; i++)
{
if (logicalNodes[i] != null)
{
return logicalNodes[i];
}
}
return null;
}
private FishingLineNode FindLastValidLogicalNode()
{
if (logicalNodes == null)
{
return null;
}
for (var i = logicalNodes.Length - 1; i >= 0; i--)
{
if (logicalNodes[i] != null)
{
return logicalNodes[i];
}
}
return null;
}
private static long BuildLogicalPointKey(int logicalIndex)
{
return (1L << 62) | (uint)logicalIndex;
@@ -565,55 +824,5 @@ namespace F2RopeLine2.FishingLine
{
return ((long)(segmentIndex + 1) << 32) | (uint)stableIndex;
}
private void OnDrawGizmosSelected()
{
if (!drawDebugChain || chainPoints.Count < 2 || restLengths.Count == 0)
{
return;
}
Gizmos.color = debugColor;
for (var i = 0; i < chainPoints.Count - 1; i++)
{
var from = chainPoints[i].Position;
var to = chainPoints[i + 1].Position;
Gizmos.DrawLine(from, to);
Gizmos.DrawSphere(from, debugNodeRadius);
var midPoint = (from + to) * 0.5f;
var actualLength = Vector3.Distance(from, to);
var restLength = i < restLengths.Count ? restLengths[i] : 0f;
#if UNITY_EDITOR
if (showSegmentLabels)
{
UnityEditor.Handles.color = debugLengthColor;
UnityEditor.Handles.Label(
midPoint,
$"S{i} rest:{restLength:F2} act:{actualLength:F2}");
}
#endif
}
Gizmos.DrawSphere(chainPoints[^1].Position, debugNodeRadius);
#if UNITY_EDITOR
if (!showNodeLabels)
{
return;
}
for (var i = 0; i < chainPoints.Count; i++)
{
var point = chainPoints[i];
var pinned = pinnedIndices.Contains(i) ? " Pinned" : string.Empty;
UnityEditor.Handles.color = debugColor;
UnityEditor.Handles.Label(
point.Position + Vector3.up * 0.04f,
$"#{i} {point.GetDebugName()}{pinned}");
}
#endif
}
}
}

View File

@@ -4,21 +4,17 @@ namespace F2RopeLine2.FishingLine
{
public class FishingLineTestController : MonoBehaviour
{
[Header("References")]
[SerializeField] private FishingLineSolver solver;
[Header("References")] [SerializeField]
private FishingLineSolver solver;
[Header("Length Test")]
[Min(0f)]
[SerializeField] private float initialFirstSegmentLength = 1.2f;
[Min(0f)]
[SerializeField] private float minFirstSegmentLength = 0.1f;
[Min(0f)]
[SerializeField] private float maxFirstSegmentLength = 5f;
[Min(0f)]
[SerializeField] private float lineAdjustSpeed = 1f;
[Header("Length Test")] [Min(0f)] [SerializeField]
private float initialFirstSegmentLength = 1.2f;
[Header("Input")]
[SerializeField] private KeyCode extendKey = KeyCode.UpArrow;
[Min(0f)] [SerializeField] private float minFirstSegmentLength = 0.1f;
[Min(0f)] [SerializeField] private float maxFirstSegmentLength = 5f;
[Min(0f)] [SerializeField] private float lineAdjustSpeed = 1f;
[Header("Input")] [SerializeField] private KeyCode extendKey = KeyCode.UpArrow;
[SerializeField] private KeyCode retractKey = KeyCode.DownArrow;
private float targetFirstSegmentLength;
@@ -38,7 +34,8 @@ namespace F2RopeLine2.FishingLine
return;
}
targetFirstSegmentLength = Mathf.Clamp(initialFirstSegmentLength, minFirstSegmentLength, maxFirstSegmentLength);
targetFirstSegmentLength =
Mathf.Clamp(initialFirstSegmentLength, minFirstSegmentLength, maxFirstSegmentLength);
solver.SetLenght(targetFirstSegmentLength);
solver.BuildLine();
}
@@ -64,10 +61,26 @@ namespace F2RopeLine2.FishingLine
if (!Mathf.Approximately(input, 0f))
{
targetFirstSegmentLength += input * lineAdjustSpeed * Time.deltaTime;
targetFirstSegmentLength = Mathf.Clamp(targetFirstSegmentLength, minFirstSegmentLength, maxFirstSegmentLength);
targetFirstSegmentLength =
Mathf.Clamp(targetFirstSegmentLength, minFirstSegmentLength, maxFirstSegmentLength);
solver.SetLenght(targetFirstSegmentLength);
}
if (solver.IsAtLimit)
{
if (solver.CurrentStretchLength > 0.04)
Debug.LogError($"CurrentStretchLength={solver.CurrentStretchLength}");
if (solver.CurrentStretchLength > 0.1 && solver.LimitStateTime > 2f)
{
Debug.LogError(
$"当前拉力达到极限,切线,极限时间={solver.LimitStateTime} CurrentStretchLength={solver.CurrentStretchLength} CurrentTensionRatio={solver.CurrentTensionRatio}");
var endNode = solver.GetEndNode();
if (endNode != null)
{
endNode.Body.isKinematic = false;
}
}
}
}
}
}
}