7 Commits

Author SHA1 Message Date
Bob.Song
c55d38b3a6 提交测试脚本 2026-04-16 23:13:02 +08:00
Bob.Song
e8b1a3e0f1 提交线修改 2026-04-16 16:54:49 +08:00
Bob.Song
f2803c9d74 line修改 2026-04-16 16:36:09 +08:00
9681d7526f 修改绳的逻辑 2026-04-16 10:38:26 +08:00
Bob.Song
a0fa4e6e9c 提交修改 2026-04-15 20:23:23 +08:00
d945638997 修改鱼线 2026-04-14 22:29:14 +08:00
d451af0c8a 测试修改提交 2026-04-06 17:08:26 +08:00
42 changed files with 17068 additions and 4037 deletions

View File

@@ -18583,6 +18583,66 @@ MonoBehaviour:
- {fileID: 102900000, guid: aa3f5467c0c153642ac320466aee0ec1, type: 3}
FilterEnum: 0
Filter: '*'
- Path: Assets/ResRaw/Prefabs/Line/FishingRopeLong.asset
Address: Plyaer/FishingRopeLong
Type: Missing
Bundle: main/plyaer.bundle
Tags:
Group:
Name: Plyaer
Enable: 1
BundleMode: 0
AddressMode: 2
Tags:
Collectors:
- {fileID: 102900000, guid: aa3f5467c0c153642ac320466aee0ec1, type: 3}
FilterEnum: 0
Filter: '*'
- Path: Assets/ResRaw/Prefabs/Line/FishingRopeLong2.asset
Address: Plyaer/FishingRopeLong2
Type: Missing
Bundle: main/plyaer.bundle
Tags:
Group:
Name: Plyaer
Enable: 1
BundleMode: 0
AddressMode: 2
Tags:
Collectors:
- {fileID: 102900000, guid: aa3f5467c0c153642ac320466aee0ec1, type: 3}
FilterEnum: 0
Filter: '*'
- Path: Assets/ResRaw/Prefabs/Line/FishingRopeShort.asset
Address: Plyaer/FishingRopeShort
Type: Missing
Bundle: main/plyaer.bundle
Tags:
Group:
Name: Plyaer
Enable: 1
BundleMode: 0
AddressMode: 2
Tags:
Collectors:
- {fileID: 102900000, guid: aa3f5467c0c153642ac320466aee0ec1, type: 3}
FilterEnum: 0
Filter: '*'
- Path: Assets/ResRaw/Prefabs/Line/Line1.prefab
Address: Plyaer/Line1
Type: GameObject
Bundle: main/plyaer.bundle
Tags:
Group:
Name: Plyaer
Enable: 1
BundleMode: 0
AddressMode: 2
Tags:
Collectors:
- {fileID: 102900000, guid: aa3f5467c0c153642ac320466aee0ec1, type: 3}
FilterEnum: 0
Filter: '*'
- Path: Assets/ResRaw/Prefabs/Line/LineHand1.prefab
Address: Plyaer/LineHand1
Type: GameObject
@@ -18613,6 +18673,36 @@ MonoBehaviour:
- {fileID: 102900000, guid: aa3f5467c0c153642ac320466aee0ec1, type: 3}
FilterEnum: 0
Filter: '*'
- Path: Assets/ResRaw/Prefabs/Line/RopeSegment_4.asset
Address: Plyaer/RopeSegment_4
Type: Missing
Bundle: main/plyaer.bundle
Tags:
Group:
Name: Plyaer
Enable: 1
BundleMode: 0
AddressMode: 2
Tags:
Collectors:
- {fileID: 102900000, guid: aa3f5467c0c153642ac320466aee0ec1, type: 3}
FilterEnum: 0
Filter: '*'
- Path: Assets/ResRaw/Prefabs/Line/Spool.mat
Address: Plyaer/Spool
Type: Material
Bundle: main/plyaer.bundle
Tags:
Group:
Name: Plyaer
Enable: 1
BundleMode: 0
AddressMode: 2
Tags:
Collectors:
- {fileID: 102900000, guid: aa3f5467c0c153642ac320466aee0ec1, type: 3}
FilterEnum: 0
Filter: '*'
- Path: Assets/ResRaw/Prefabs/Player/Anim/AnimationClip/CameraCrouch.anim
Address: Plyaer/CameraCrouch
Type: AnimationClip

BIN
Assets/New Terrain 13.asset Normal file

Binary file not shown.

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 953400dda9b03df4d967e2e7dd8ef9f8
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 15600000
userData:
assetBundleName:
assetBundleVariant:

BIN
Assets/New Terrain 14.asset Normal file

Binary file not shown.

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e5b77e954e13d8644859b63f2252924f
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 15600000
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c29a67f2195883840b049b2c2a54a55c
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 90165a559e0af984497f40ee19419ea5
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c70c206ebccc14c4eb6a0cdbe80779f7
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,536 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1386063717907585334
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4162208118158024875}
- component: {fileID: 6741752443570310990}
m_Layer: 0
m_Name: Line1
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4162208118158024875
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1386063717907585334}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1479551252035771110}
- {fileID: 153991853389016720}
- {fileID: 6385925521264460254}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &6741752443570310990
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1386063717907585334}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 78dc478e56ff48849761861244c93535, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::NBF.FishingLineSolver
ConfigId: 0
LineType: 0
anchorTransform: {fileID: 0}
logicalNodes:
- {fileID: 9075018646815510674}
- {fileID: 3453378298765533283}
- {fileID: 7410869349490881487}
PinchController: {fileID: 0}
lengthLimitTolerance: 0.01
breakStretchThreshold: 0.05
--- !u!1 &2899898627497558851
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 153991853389016720}
- component: {fileID: 828578718743757123}
- component: {fileID: 9053429622791349644}
- component: {fileID: 3453378298765533283}
m_Layer: 15
m_Name: Float
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!4 &153991853389016720
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2899898627497558851}
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: []
m_Father: {fileID: 4162208118158024875}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!54 &828578718743757123
Rigidbody:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2899898627497558851}
serializedVersion: 5
m_Mass: 0.1
m_LinearDamping: 1
m_AngularDamping: 0.1
m_CenterOfMass: {x: 0, y: 0, z: 0}
m_InertiaTensor: {x: 0.001, y: 0.001, z: 0.001}
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: 0
m_UseGravity: 1
m_IsKinematic: 0
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 2
--- !u!153 &9053429622791349644
ConfigurableJoint:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2899898627497558851}
serializedVersion: 4
m_ConnectedBody: {fileID: 2686136634991136867}
m_ConnectedArticulationBody: {fileID: 0}
m_Anchor: {x: 0, y: -0.01, z: 0}
m_Axis: {x: 0, y: 0, z: 0}
m_AutoConfigureConnectedAnchor: 0
m_ConnectedAnchor: {x: 0, y: 0, z: 0}
m_SecondaryAxis: {x: 0, y: 0, 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
m_ProjectionAngle: 0
m_ConfiguredInWorldSpace: 0
m_SwapBodies: 0
m_BreakForce: Infinity
m_BreakTorque: Infinity
m_EnableCollision: 0
m_EnablePreprocessing: 0
m_MassScale: 1
m_ConnectedMassScale: 1
--- !u!114 &3453378298765533283
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2899898627497558851}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f89affce787d4a1cbcd68bed409183d7, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::NBF.FishingLineNode
_solver: {fileID: 0}
nodeType: 1
body: {fileID: 828578718743757123}
Rope: {fileID: 0}
interaction: {fileID: 0}
_joint: {fileID: 9053429622791349644}
segmentLengthToNext: 0.5
runtimeChainIndex: -1
features: []
motionFeatures: []
activeMotionFeature: {fileID: 0}
--- !u!1 &6377338098506485345
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6385925521264460254}
- component: {fileID: 3393178238064969316}
- component: {fileID: 1271283185862622601}
- component: {fileID: 8513982619376093011}
- component: {fileID: 7410869349490881487}
m_Layer: 15
m_Name: Lure
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!4 &6385925521264460254
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6377338098506485345}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: -1.5, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 4162208118158024875}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!54 &3393178238064969316
Rigidbody:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6377338098506485345}
serializedVersion: 5
m_Mass: 0.01
m_LinearDamping: 1
m_AngularDamping: 0.1
m_CenterOfMass: {x: 0, y: 0, z: 0}
m_InertiaTensor: {x: 0.001, y: 0.001, z: 0.001}
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: 0
m_UseGravity: 1
m_IsKinematic: 0
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 2
--- !u!153 &1271283185862622601
ConfigurableJoint:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6377338098506485345}
serializedVersion: 4
m_ConnectedBody: {fileID: 828578718743757123}
m_ConnectedArticulationBody: {fileID: 0}
m_Anchor: {x: 0, y: 0, z: 0}
m_Axis: {x: 0, y: 0, z: 0}
m_AutoConfigureConnectedAnchor: 0
m_ConnectedAnchor: {x: 0, y: 0, z: 0}
m_SecondaryAxis: {x: 0, y: 0, 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
m_ProjectionAngle: 0
m_ConfiguredInWorldSpace: 0
m_SwapBodies: 0
m_BreakForce: Infinity
m_BreakTorque: Infinity
m_EnableCollision: 0
m_EnablePreprocessing: 0
m_MassScale: 1
m_ConnectedMassScale: 1
--- !u!135 &8513982619376093011
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6377338098506485345}
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.003
m_Center: {x: 0, y: -0.0015, z: 0}
--- !u!114 &7410869349490881487
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6377338098506485345}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f89affce787d4a1cbcd68bed409183d7, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::NBF.FishingLineNode
_solver: {fileID: 0}
nodeType: 3
body: {fileID: 3393178238064969316}
Rope: {fileID: 0}
interaction: {fileID: 0}
_joint: {fileID: 1271283185862622601}
segmentLengthToNext: 0.5
runtimeChainIndex: -1
features: []
motionFeatures: []
activeMotionFeature: {fileID: 0}
--- !u!1 &7697635668067303442
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1479551252035771110}
- component: {fileID: 2686136634991136867}
- component: {fileID: 9075018646815510674}
m_Layer: 0
m_Name: Start
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!4 &1479551252035771110
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7697635668067303442}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 4162208118158024875}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!54 &2686136634991136867
Rigidbody:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7697635668067303442}
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: 0
m_ImplicitTensor: 0
m_UseGravity: 0
m_IsKinematic: 1
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0
--- !u!114 &9075018646815510674
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7697635668067303442}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f89affce787d4a1cbcd68bed409183d7, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::NBF.FishingLineNode
_solver: {fileID: 0}
nodeType: 0
body: {fileID: 2686136634991136867}
Rope: {fileID: 0}
interaction: {fileID: 0}
_joint: {fileID: 0}
segmentLengthToNext: 0.5
runtimeChainIndex: -1
features: []
motionFeatures: []
activeMotionFeature: {fileID: 0}

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a41193e381908de44b097f1f57b43028
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,137 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Spool
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap:
RenderType: Opaque
disabledShaderPasses:
- MOTIONVECTORS
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BaseMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
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:
- _AddPrecomputedVelocity: 0
- _AlphaClip: 0
- _AlphaToMask: 0
- _Blend: 0
- _BlendModePreserveSpecular: 1
- _BumpScale: 1
- _ClearCoatMask: 0
- _ClearCoatSmoothness: 0
- _Cull: 2
- _Cutoff: 0.5
- _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _DstBlendAlpha: 0
- _EnvironmentReflections: 1
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Metallic: 0
- _OcclusionStrength: 1
- _Parallax: 0.005
- _QueueOffset: 0
- _ReceiveShadows: 1
- _Smoothness: 0.5
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 0
- _WorkflowMode: 1
- _XRMotionVectorsPass: 1
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1
--- !u!114 &4684454134489156479
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

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 95a26dca51ebe9c4da5949631fa36027
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -55,6 +55,7 @@ MonoBehaviour:
velocityDampen: 0.95
stiffness: 0.8
iterations: 10
hardTightenIterations: 2
initialLength: 0
lengthSmoothTime: 0.15
lengthChangeVelocityKill: 0.4
@@ -71,6 +72,7 @@ MonoBehaviour:
groundSampleStep: 3
groundInterpolate: 1
groundUpdateEvery: 1
groundPostConstraintIterations: 2
constrainToWaterSurface: 1
waterLevelY: 0
waterSurfaceOffset: 0.002
@@ -85,11 +87,15 @@ MonoBehaviour:
movingSpeedThreshold: 2
smooth: 1
lineWidth: 0.001
cullRemoteRopeWhenInvisible: 1
localOwnerAlwaysSimulate: 1
visibilityCheckEvery: 10
visibilityViewportPadding: 0.08
airDrag: 0.2
airDragXZ: 0.6
--- !u!120 &991521994724602848
LineRenderer:
serializedVersion: 2
serializedVersion: 3
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
@@ -135,6 +141,7 @@ LineRenderer:
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_Positions:
- {x: 0, y: 0, z: 0}
- {x: 0, y: 0, z: 1}
@@ -193,7 +200,6 @@ LineRenderer:
textureScale: {x: 1, y: 1}
shadowBias: 0.5
generateLightingData: 0
m_MaskInteraction: 0
m_UseWorldSpace: 1
m_Loop: 0
m_ApplyActiveColorSpace: 1
@@ -470,6 +476,7 @@ MonoBehaviour:
Lure: {fileID: 1923684598771359451}
Bobber: {fileID: 2717383850592950062}
PinchController: {fileID: 2475726686148443307}
LinelenghtDiferent: 0
--- !u!114 &3273975985231415050
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -668,7 +675,7 @@ MonoBehaviour:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1858052053854210}
m_Enabled: 1
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2dedfafdc2d747d98c682cde3e28e513, type: 3}
m_Name:
@@ -776,6 +783,7 @@ MonoBehaviour:
velocityDampen: 0.95
stiffness: 0.8
iterations: 10
hardTightenIterations: 2
initialLength: 0
lengthSmoothTime: 0.15
lengthChangeVelocityKill: 0.4
@@ -792,6 +800,7 @@ MonoBehaviour:
groundSampleStep: 3
groundInterpolate: 1
groundUpdateEvery: 1
groundPostConstraintIterations: 2
constrainToWaterSurface: 0
waterLevelY: 0
waterSurfaceOffset: 0.002
@@ -806,11 +815,15 @@ MonoBehaviour:
movingSpeedThreshold: 2
smooth: 1
lineWidth: 0.001
cullRemoteRopeWhenInvisible: 1
localOwnerAlwaysSimulate: 1
visibilityCheckEvery: 10
visibilityViewportPadding: 0.08
airDrag: 0.9
airDragXZ: 0.6
--- !u!120 &484878994603287356
LineRenderer:
serializedVersion: 2
serializedVersion: 3
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
@@ -856,6 +869,7 @@ LineRenderer:
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_Positions:
- {x: 0, y: 0, z: 0}
- {x: 0, y: 0, z: 1}
@@ -914,7 +928,6 @@ LineRenderer:
textureScale: {x: 1, y: 1}
shadowBias: 0.5
generateLightingData: 0
m_MaskInteraction: 0
m_UseWorldSpace: 1
m_Loop: 0
m_ApplyActiveColorSpace: 1
@@ -953,7 +966,7 @@ Transform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!120 &120710333716555736
LineRenderer:
serializedVersion: 2
serializedVersion: 3
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
@@ -999,6 +1012,7 @@ LineRenderer:
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_Positions:
- {x: 0, y: 0, z: 0}
- {x: 0, y: 0, z: 1}
@@ -1057,7 +1071,6 @@ LineRenderer:
textureScale: {x: 1, y: 1}
shadowBias: 0.5
generateLightingData: 0
m_MaskInteraction: 0
m_UseWorldSpace: 1
m_Loop: 0
m_ApplyActiveColorSpace: 1

File diff suppressed because it is too large Load Diff

View File

@@ -1630,8 +1630,8 @@ Camera:
y: 0
width: 1
height: 1
near clip plane: 0.01
far clip plane: 5000
near clip plane: 0.1
far clip plane: 3000
field of view: 60.000004
orthographic: 0
orthographic size: 5

View File

@@ -2,8 +2,6 @@
using Fantasy;
using Fantasy.Async;
using Fantasy.Entitas;
using NBF.Fishing2;
using RootMotion.FinalIK;
using Log = NBC.Log;
namespace NBF

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 23b031de32454768b4cd922619ef4e8e
timeCreated: 1776227094

View File

@@ -8,20 +8,12 @@ using UnityEngine;
namespace NBF
{
public enum LineType
{
Hand,
HandDouble,
Spinning,
SpinningFloat,
}
public class FLine : FGearBase
{
public LineType LineType;
[SerializeField] private bool isLureConnect;
[SerializeField] private RodLine rodLine;
/// <summary>
/// 主线
@@ -41,6 +33,9 @@ namespace NBF
public float LinelenghtDiferent;
public float Length { get; private set; }
protected override void OnInit()
{
var tipRb = Rod.Asset.LineConnectorRigidbody;
@@ -65,17 +60,6 @@ namespace NBF
});
StartCoroutine(LureUseGravity());
if (isLureConnect)
{
fishingRope.Init(Rod);
}
else
{
fishingRope.Init(Rod);
bobberRope.Init(Rod);
}
// rodLine.GenerateLineRendererRope(guides.ToArray(), _LineThickness);
}
public void InitTest(Rigidbody tipRb)
@@ -101,15 +85,6 @@ namespace NBF
});
StartCoroutine(LureUseGravity());
if (isLureConnect)
{
fishingRope.Init(Rod);
}
else
{
fishingRope.Init(Rod);
bobberRope.Init(Rod);
}
}
private IEnumerator LureUseGravity()
@@ -157,7 +132,7 @@ namespace NBF
}
// return 0;
//第一个节点到竿稍的位置-第一段鱼线长度
return Vector3.Distance(Bobber.transform.position, Bobber.JointRb.transform.position) -
fishingRope.GetCurrentLength();
@@ -169,5 +144,61 @@ namespace NBF
}
#endregion
#region
[Header("Limit Detection")]
[Min(0f)]
// 极限判定的长度容差,允许链路在总长或单段长度上存在少量误差。
[SerializeField]
private float lengthLimitTolerance = 0.01f;
[Min(0f)]
// 达到极限后,只有当前超长值大于该阈值时,才开始进入断线候选计时。
[SerializeField]
private float breakStretchThreshold = 0.05f;
/// <summary>
/// 当鱼线达到断线条件时发出的一次性消息。
/// 外部可订阅该事件,在回调中执行切线、播放表现或状态切换。
/// </summary>
public event Action<FLine> OnLineBreakRequested;
/// <summary>
/// 当前断线候选状态的累计时间。
/// 只有在处于极限状态,且 CurrentStretchLength 大于断线阈值时才会累加;否则重置为 0。
/// </summary>
public float LimitStateTime { get; private set; }
/// <summary>
/// 当前拉力极限百分比。
/// 当超长值小于等于 lengthLimitTolerance 时为 0
/// 当超长值大于等于 breakStretchThreshold 时为 100
/// 中间区间按线性比例映射,供 UI 显示使用。
/// </summary>
public float CurrentBreakStretchPercent => EvaluateBreakStretchPercent(Length);
private float EvaluateBreakStretchPercent(float stretchLength)
{
if (stretchLength <= lengthLimitTolerance)
{
return 0f;
}
if (stretchLength >= breakStretchThreshold)
{
return 100f;
}
if (breakStretchThreshold <= lengthLimitTolerance)
{
return 100f;
}
return Mathf.InverseLerp(lengthLimitTolerance, breakStretchThreshold, stretchLength) * 100f;
}
#endregion
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: aecb364a5aa3486d9e9c4f37ba801403
timeCreated: 1776227164

View File

@@ -0,0 +1,63 @@
using UnityEngine;
namespace NBF
{
public abstract class FishingLineNodeFeature : MonoBehaviour
{
/// <summary>
/// 当前功能组件所属的节点。
/// </summary>
public FishingLineNode Node { get; private set; }
/// <summary>
/// 当前功能组件所属的鱼线求解器。
/// </summary>
public FLine Solver { get; private set; }
/// <summary>
/// 将当前功能组件绑定到指定节点和求解器。
/// </summary>
public void Bind(FishingLineNode node, FLine solver)
{
Node = node;
Solver = solver;
if (!IsSupportedNode(node))
{
Debug.LogWarning($"{GetType().Name} 不适用于节点 {node.name} 的当前配置。", this);
}
OnBind();
}
/// <summary>
/// 当前功能组件是否支持挂在该节点上。
/// 子类可按节点类型、尾节点类型或产品标识做限制。
/// </summary>
public virtual bool IsSupportedNode(FishingLineNode node)
{
return node != null;
}
/// <summary>
/// 节点与求解器绑定完成后的回调。
/// </summary>
protected virtual void OnBind()
{
}
/// <summary>
/// 鱼线链路重建完成后的回调。
/// </summary>
public virtual void OnLineBuilt()
{
}
/// <summary>
/// 鱼线达到断线条件后的回调。
/// </summary>
public virtual void OnLineBreakRequested()
{
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: ad2d8ec3c7054440819bc7a15991f724
timeCreated: 1776227197

View File

@@ -0,0 +1,47 @@
using UnityEngine;
namespace NBF
{
public abstract class FishingLineNodeMotionFeature : FishingLineNodeFeature
{
[Header("Motion Control")] [SerializeField]
private int priorityOffset;
/// <summary>
/// 当前运动控制组件的优先级。
/// 值越大,越容易取得节点运动控制权。
/// 最终优先级 = 默认优先级 + 调整值。
/// </summary>
public int Priority => DefaultPriority + priorityOffset;
/// <summary>
/// 当前运动控制组件的默认优先级。
/// 子类可通过重写该值,决定自己相对默认物理的抢占能力。
/// </summary>
protected virtual int DefaultPriority => 0;
/// <summary>
/// 当前帧该运动控制组件是否希望接管节点运动。
/// </summary>
public abstract bool CanControl();
/// <summary>
/// 当前运动控制组件开始接管节点时的回调。
/// </summary>
public virtual void OnMotionActivated()
{
}
/// <summary>
/// 当前运动控制组件失去节点控制权时的回调。
/// </summary>
public virtual void OnMotionDeactivated()
{
}
/// <summary>
/// 当前运动控制组件正在接管节点时,每个 FixedUpdate 执行的逻辑。
/// </summary>
public abstract void TickMotion(float deltaTime);
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: aabd7c367ac74642942c4a4499e35281
timeCreated: 1776227237

View File

@@ -0,0 +1,261 @@
using System;
using System.Collections.Generic;
using UnityEngine;
namespace NBF
{
public class FishingLineNode : MonoBehaviour
{
public enum NodeType
{
Start,
Float,
Weight,
Tail
}
[SerializeField] private FLine _solver;
[Header("Node")] [SerializeField] private NodeType nodeType = NodeType.Tail;
[SerializeField] public Rigidbody body;
public Rope Rope;
[SerializeField] private MonoBehaviour interaction;
[SerializeField] private ConfigurableJoint _joint;
[Header("Segment To Next Logical Node")] [Min(0f)] [SerializeField]
private float segmentLengthToNext = 0.5f;
[SerializeField] private int runtimeChainIndex = -1;
[SerializeField] private List<FishingLineNodeFeature> features = new();
[SerializeField] private List<FishingLineNodeMotionFeature> motionFeatures = new();
private bool featureCacheReady;
[SerializeField] private FishingLineNodeMotionFeature activeMotionFeature;
/// <summary>
/// 当前正在接管节点运动的组件。
/// </summary>
public FishingLineNodeMotionFeature ActiveMotionFeature => activeMotionFeature;
public NodeType Type
{
get => nodeType;
set => nodeType = value;
}
public float Lenght => _joint != null ? _joint.linearLimit.limit : 0f;
public Rigidbody Body => body;
public MonoBehaviour Interaction => interaction;
public ConfigurableJoint Joint => _joint;
public int RuntimeChainIndex => runtimeChainIndex;
public Vector3 Position => transform.position;
private void Reset()
{
TryGetComponent(out body);
}
private void Awake()
{
if (!_solver) _solver = GetComponentInParent<FLine>();
if (!_joint) _joint = GetComponent<ConfigurableJoint>();
EnsureFeatureCache();
}
private void Start()
{
BindFeatures(_solver);
}
private void FixedUpdate()
{
EnsureFeatureCache();
UpdateMotionControl(Time.fixedDeltaTime);
}
private void OnValidate()
{
if (body == null)
{
TryGetComponent(out body);
}
segmentLengthToNext = Mathf.Max(0f, segmentLengthToNext);
}
#region Line
public void SetLenght(float lenght)
{
if (!_joint) return;
if (!Mathf.Approximately(lenght, _joint.linearLimit.limit))
{
_joint.linearLimit = new SoftJointLimit() { limit = lenght };
Rope.SetTargetLength(lenght - 0.1f);
}
}
#endregion
#region Feature
/// <summary>
/// 获取节点上的第一个指定类型功能组件。
/// </summary>
public T GetFeature<T>() where T : FishingLineNodeFeature
{
EnsureFeatureCache();
for (var i = 0; i < features.Count; i++)
{
if (features[i] is T result)
{
return result;
}
}
return null;
}
/// <summary>
/// 尝试获取节点上的指定类型功能组件。
/// </summary>
public bool TryGetFeature<T>(out T feature) where T : FishingLineNodeFeature
{
feature = GetFeature<T>();
return feature != null;
}
/// <summary>
/// 刷新并重新绑定当前节点上的功能组件。
/// </summary>
public void BindFeatures(FLine solver)
{
EnsureFeatureCache();
foreach (var t in features)
{
t.Bind(this, solver);
}
ResolveMotionFeature(forceRefresh: true);
}
/// <summary>
/// 通知当前节点上的所有功能组件,鱼线已重建完成。
/// </summary>
public void NotifyLineBuilt()
{
EnsureFeatureCache();
foreach (var t in features)
{
t.OnLineBuilt();
}
ResolveMotionFeature(forceRefresh: true);
}
/// <summary>
/// 通知当前节点上的所有功能组件,鱼线已经达到断线条件。
/// </summary>
public void NotifyLineBreakRequested()
{
EnsureFeatureCache();
foreach (var t in features)
{
t.OnLineBreakRequested();
}
}
private void EnsureFeatureCache()
{
if (!featureCacheReady)
{
RefreshFeatures();
}
}
private void RefreshFeatures()
{
features.Clear();
motionFeatures.Clear();
GetComponents(features);
for (var i = 0; i < features.Count; i++)
{
if (features[i] is FishingLineNodeMotionFeature motionFeature)
{
motionFeatures.Add(motionFeature);
}
}
activeMotionFeature = null;
featureCacheReady = true;
}
private void UpdateMotionControl(float deltaTime)
{
var motionFeature = ResolveMotionFeature(forceRefresh: false);
if (motionFeature == null)
{
return;
}
motionFeature.TickMotion(deltaTime);
}
private FishingLineNodeMotionFeature ResolveMotionFeature(bool forceRefresh)
{
EnsureFeatureCache();
var bestMotionFeature = default(FishingLineNodeMotionFeature);
var bestPriority = int.MinValue;
foreach (var motionFeature in motionFeatures)
{
var r = !motionFeature.IsSupportedNode(this);
var n = !motionFeature.CanControl();
if (motionFeature == null || !motionFeature.IsSupportedNode(this) || !motionFeature.CanControl())
{
continue;
}
if (bestMotionFeature != null && motionFeature.Priority <= bestPriority)
{
continue;
}
bestMotionFeature = motionFeature;
bestPriority = motionFeature.Priority;
}
if (!forceRefresh && ReferenceEquals(activeMotionFeature, bestMotionFeature))
{
return activeMotionFeature;
}
if (activeMotionFeature != null && !ReferenceEquals(activeMotionFeature, bestMotionFeature))
{
activeMotionFeature.OnMotionDeactivated();
}
activeMotionFeature = bestMotionFeature;
if (activeMotionFeature != null)
{
activeMotionFeature.OnMotionActivated();
}
return activeMotionFeature;
}
#endregion
private void OnDrawGizmos()
{
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: f89affce787d4a1cbcd68bed409183d7
timeCreated: 1776227097

View File

@@ -0,0 +1,312 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace NBF
{
public enum LineType
{
Hand,
HandDouble,
Spinning,
SpinningFloat,
}
public class FishingLineSolver : FGearBase
{
[SerializeField] public LineType LineType;
[Header("References")] [SerializeField]
private Transform anchorTransform;
[SerializeField] private FishingLineNode[] logicalNodes = Array.Empty<FishingLineNode>();
public JointPinchController PinchController;
protected override void OnInit()
{
// var tipRb = Rod.Asset.LineConnectorRigidbody;
// anchorTransform = tipRb.transform;
//
// GetComponentsInChildren<Transform>(includeInactive: true).ToList().ForEach(delegate(Transform i)
// {
// i.gameObject.SetActive(true);
// });
}
private void Awake()
{
}
private void Start()
{
InitRenderer();
GetComponentsInChildren<Transform>(includeInactive: true).ToList().ForEach(delegate(Transform i)
{
i.gameObject.SetActive(true);
});
}
private void FixedUpdate()
{
UpdateAnchorNode();
UpdateStretchLength();
}
#region Start Node
private void ConfigureStartNode()
{
if (logicalNodes == null || logicalNodes.Length == 0 || logicalNodes[0] == null)
{
return;
}
var startNode = logicalNodes[0];
startNode.Type = FishingLineNode.NodeType.Start;
if (startNode.Body != null)
{
startNode.Body.isKinematic = true;
startNode.Body.interpolation = RigidbodyInterpolation.Interpolate;
startNode.Body.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
}
UpdateAnchorNode();
}
private void UpdateAnchorNode()
{
if (anchorTransform == null || logicalNodes == null || logicalNodes.Length == 0 || logicalNodes[0] == null)
{
return;
}
var startNode = logicalNodes[0];
startNode.transform.SetPositionAndRotation(anchorTransform.position, anchorTransform.rotation);
if (startNode.Body != null)
{
if (!startNode.Body.isKinematic)
{
startNode.Body.linearVelocity = Vector3.zero;
startNode.Body.angularVelocity = Vector3.zero;
}
}
}
#endregion
#region Line
/// <summary>
/// 设置指定逻辑段的配置长度。
/// segmentIndex 为 0 时表示第一段;大于 0 时表示对应逻辑节点到下一个逻辑节点的线长。
/// </summary>
public void SetLenght(float length, int index = 0)
{
ConfigureStartNode();
var node = logicalNodes[index + 1];
if (node != null)
{
node.SetLenght(length);
}
}
#endregion
#region LineNode
/// <summary>
/// 当前配置的逻辑节点只读列表。
/// 外部可读取节点顺序,但不应直接修改数组内容。
/// </summary>
public IReadOnlyList<FishingLineNode> LogicalNodes => logicalNodes;
/// <summary>
/// 根据类型获取逻辑节点类型
/// </summary>
/// <param name="nodeType"></param>
/// <returns></returns>
public FishingLineNode GetLogicalNode(FishingLineNode.NodeType nodeType)
{
foreach (var fishingLineNode in logicalNodes)
{
if (fishingLineNode.Type == nodeType)
{
return fishingLineNode;
}
}
return null;
}
/// <summary>
/// 获取指定顺序索引的逻辑节点。
/// 索引基于 logicalNodes 配置顺序;超出范围或节点为空时返回 null。
/// </summary>
public FishingLineNode GetLogicalNode(int logicalIndex)
{
if (logicalNodes == null || logicalIndex < 0 || logicalIndex >= logicalNodes.Length)
{
return null;
}
return logicalNodes[logicalIndex];
}
/// <summary>
/// 获取当前起点逻辑节点。
/// 会返回配置顺序中第一个非空节点。
/// </summary>
public FishingLineNode GetStartNode()
{
return FindFirstValidLogicalNode();
}
/// <summary>
/// 获取当前终点逻辑节点。
/// 会返回配置顺序中最后一个非空节点。
/// </summary>
public FishingLineNode GetEndNode()
{
return FindLastValidLogicalNode();
}
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;
}
#endregion
#region
/// <summary>
/// 当前逻辑链总长度超出配置总长度的部分,小于等于零时记为 0。
/// </summary>
[Header("Limit Detection")]
public float CurrentStretchLength { get; private set; }
[Min(0f)]
// 极限判定的长度容差,允许链路在总长或单段长度上存在少量误差。
[SerializeField]
private float lengthLimitTolerance = 0.01f;
[Min(0f)]
// 达到极限后,只有当前超长值大于该阈值时,才开始进入断线候选计时。
[SerializeField]
private float breakStretchThreshold = 0.05f;
/// <summary>
/// 当鱼线达到断线条件时发出的一次性消息。
/// 外部可订阅该事件,在回调中执行切线、播放表现或状态切换。
/// </summary>
public event Action<FishingLineSolver> OnLineBreakRequested;
/// <summary>
/// 当前断线候选状态的累计时间。
/// 只有在处于极限状态,且 CurrentStretchLength 大于断线阈值时才会累加;否则重置为 0。
/// </summary>
public float LimitStateTime { get; private set; }
/// <summary>
/// 当前拉力极限百分比。
/// 当超长值小于等于 lengthLimitTolerance 时为 0
/// 当超长值大于等于 breakStretchThreshold 时为 100
/// 中间区间按线性比例映射,供 UI 显示使用。
/// </summary>
public float CurrentBreakStretchPercent => EvaluateBreakStretchPercent(CurrentStretchLength);
private float EvaluateBreakStretchPercent(float stretchLength)
{
if (stretchLength <= lengthLimitTolerance)
{
return 0f;
}
if (stretchLength >= breakStretchThreshold)
{
return 100f;
}
if (breakStretchThreshold <= lengthLimitTolerance)
{
return 100f;
}
return Mathf.InverseLerp(lengthLimitTolerance, breakStretchThreshold, stretchLength) * 100f;
}
private void UpdateStretchLength()
{
}
#endregion
#region Renderer
private Transform _ropeRoot;
private void InitRenderer()
{
var root = new GameObject("RopeRoot");
_ropeRoot = root.transform;
_ropeRoot.SetParent(transform);
CreateRopes();
}
private void CreateRopes()
{
foreach (var node in LogicalNodes)
{
if (node.Type == FishingLineNode.NodeType.Start) continue;
var ropeObject = new GameObject($"rope_{node.Type}");
ropeObject.transform.SetParent(_ropeRoot);
var rope = ropeObject.AddComponent<Rope>();
node.Rope = rope;
// rope.groundMask = LayerMask.GetMask("Terrain");
rope.startAnchor = node.Joint.connectedBody;
rope.endAnchor = node.body;
}
}
#endregion
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 78dc478e56ff48849761861244c93535
timeCreated: 1776227360

View File

@@ -0,0 +1,88 @@
using UnityEngine;
namespace NBF
{
public class FishingLineTestController : MonoBehaviour
{
[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("Input")] [SerializeField] private KeyCode extendKey = KeyCode.UpArrow;
[SerializeField] private KeyCode retractKey = KeyCode.DownArrow;
private float targetFirstSegmentLength;
private void Reset()
{
if (solver == null)
{
solver = GetComponent<FishingLineSolver>();
}
}
private void Start()
{
if (solver == null)
{
return;
}
targetFirstSegmentLength =
Mathf.Clamp(initialFirstSegmentLength, minFirstSegmentLength, maxFirstSegmentLength);
solver.SetLenght(targetFirstSegmentLength);
solver.SetLenght(0.5f, 1);
// solver.BuildLine();
solver.OnLineBreakRequested += OnLineBreakRequested;
}
private void OnLineBreakRequested(FishingLineSolver lineSolver)
{
Debug.LogError($"当前拉力达到极限,切线,极限时间={lineSolver.LimitStateTime}");
var endNode = lineSolver.GetEndNode();
if (endNode != null)
{
endNode.Body.isKinematic = false;
}
}
private void Update()
{
if (solver == null)
{
return;
}
var input = 0f;
if (Input.GetKey(extendKey))
{
input += 1f;
}
if (Input.GetKey(retractKey))
{
input -= 1f;
}
if (!Mathf.Approximately(input, 0f))
{
targetFirstSegmentLength += input * lineAdjustSpeed * Time.deltaTime;
targetFirstSegmentLength =
Mathf.Clamp(targetFirstSegmentLength, minFirstSegmentLength, maxFirstSegmentLength);
solver.SetLenght(targetFirstSegmentLength);
}
if (solver.CurrentBreakStretchPercent > 0)
{
// Debug.LogError(solver.CurrentBreakStretchPercent);
}
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 5382d66f55f6463cb469c5094b0e7a6b
timeCreated: 1776234046

View File

@@ -14,23 +14,29 @@ public class Rope : MonoBehaviour
[Header("Physics (Dynamic Nodes, Fixed Segment Len)")] [SerializeField, Min(0.01f), Tooltip("物理每段固定长度(越小越细致越耗)")]
private float physicsSegmentLen = 0.15f;
[SerializeField, Range(2, 200)] private int minPhysicsNodes = 12;
[SerializeField, Range(2, 200)] private int minPhysicsNodes = 2;
[SerializeField, Range(2, 400), Tooltip("物理节点上限(仅用于性能保护;与“最大长度不限制”不是一回事)")]
private int maxPhysicsNodes = 120;
private int maxPhysicsNodes = 200;
[SerializeField] private float gravityStrength = 2.0f;
[SerializeField] private float gravityStrength = 6.0f;
[SerializeField, Range(0f, 1f)] private float velocityDampen = 0.95f;
[SerializeField, Range(0.0f, 1.0f), Tooltip("约束修正强度越大越硬。0.6~0.9 常用")]
private float stiffness = 0.8f;
[SerializeField, Range(1, 80), Tooltip("迭代次数。鱼线 10~30 通常够用")]
private int iterations = 20;
[SerializeField, Range(1, 80), Tooltip("迭代次数")]
private int iterations = 10;
[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)]
@@ -40,7 +46,7 @@ public class Rope : MonoBehaviour
private float lengthSmoothTime = 0.15f;
[Tooltip("当长度在变化时额外把速度压掉一些防抖。0=不额外处理1=变化时几乎清速度(建议只在收线生效)")] [SerializeField, Range(0f, 1f)]
private float lengthChangeVelocityKill = 0.6f;
private float lengthChangeVelocityKill = 0.4f;
[Tooltip("允许的最小松弛余量(避免目标长度刚好等于锚点距离时抖动)")] [SerializeField, Min(0f)]
private float minSlack = 0.002f;
@@ -52,9 +58,9 @@ public class Rope : MonoBehaviour
private float nodeHysteresis = 0.05f;
[Header("Simple Ground/Water Constraint (Cheap)")] [SerializeField]
private bool constrainToGround = true;
private bool constrainToGround = false;
[SerializeField] private LayerMask groundMask = ~0;
[SerializeField] private LayerMask groundMask = 0;
[SerializeField, Min(0f)] private float groundRadius = 0.01f;
[SerializeField, Min(0f)] private float groundCastHeight = 1.0f;
[SerializeField, Min(0.01f)] private float groundCastDistance = 2.5f;
@@ -66,7 +72,7 @@ public class Rope : MonoBehaviour
private bool groundInterpolate = true;
[SerializeField, Range(1, 8), Tooltip("每隔多少次FixedUpdate更新一次地面约束")]
private int groundUpdateEvery = 2;
private int groundUpdateEvery = 1;
[SerializeField, Range(0, 8), Tooltip("地面约束后,再做几次长度约束,减少 poly 被地面抬长")]
private int groundPostConstraintIterations = 2;
@@ -74,7 +80,7 @@ public class Rope : MonoBehaviour
private int _groundFrameCounter;
[Header("Simple Water Float (Cheap)")] [SerializeField, Tooltip("绳子落到水面以下时,是否把节点约束回水面")]
private bool constrainToWaterSurface = true;
private bool constrainToWaterSurface = false;
[SerializeField, Tooltip("静态水面高度;如果你后面接波浪水面,可改成采样函数")]
private float waterLevelY = 0f;
@@ -129,7 +135,7 @@ public class Rope : MonoBehaviour
private float visibilityViewportPadding = 0.08f;
[Header("Air Drag (Stable)")] [SerializeField, Range(0f, 5f), Tooltip("空气阻力Y向指数衰减越大越不飘")]
private float airDrag = 0.9f;
private float airDrag = 0.2f;
[SerializeField, Range(0f, 2f), Tooltip("横向额外阻力XZ指数衰减越大越不左右飘")]
private float airDragXZ = 0.6f;
@@ -173,13 +179,6 @@ public class Rope : MonoBehaviour
private int _tIdleSubdiv = -1;
private int _tMovingSubdiv = -1;
private FRod _rod;
public void Init(FRod rod)
{
_rod = rod;
if (Application.isPlaying)
RefreshVisibilityState(true);
}
// Catmull t caches只缓存 idle/moving 两档,减少每帧重复乘法)
private struct TCaches
@@ -205,12 +204,15 @@ public class Rope : MonoBehaviour
RefreshVisibilityState(true);
}
private void OnValidate()
{
renderSubdivisionsIdle = Mathf.Max(renderSubdivisionsIdle, 1);
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);
@@ -243,14 +245,6 @@ public class Rope : MonoBehaviour
_endTr = endAnchor ? endAnchor.transform : null;
}
private bool ShouldAlwaysSimulate()
{
if (!localOwnerAlwaysSimulate)
return false;
var owner = _rod?.PlayerItem?.Owner;
return owner == null || owner.IsSelf;
}
private Transform GetActiveCameraTransform()
{
@@ -304,7 +298,7 @@ public class Rope : MonoBehaviour
private void RefreshVisibilityState(bool force = false)
{
if (!cullRemoteRopeWhenInvisible || ShouldAlwaysSimulate())
if (!cullRemoteRopeWhenInvisible)
{
_isCulledByVisibility = false;
if (_lineRenderer)
@@ -532,6 +526,7 @@ public class Rope : MonoBehaviour
}
SolveHardDistanceConstraints(hardTightenIterations);
SolveHardDistanceConstraintsAdaptive();
LockAnchorsHard();
if (constrainToGround)
@@ -572,16 +567,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()
@@ -598,9 +584,10 @@ public class Rope : MonoBehaviour
Time.fixedDeltaTime
);
// 长度变化时额外压一点速度,减少收放线时抖动
float delta = Mathf.Abs(_targetLength - _currentLength);
if (delta > 0.0001f && lengthChangeVelocityKill > 0f)
// 仅在收线(目标长度小于当前长度)时额外压速度;
// 放线时不要压速度,否则新增节点下落会出现“顿一下再突然加速”。
float reelInDelta = _currentLength - _targetLength;
if (reelInDelta > 0.0001f && lengthChangeVelocityKill > 0f)
{
float keep = 1f - Mathf.Clamp01(lengthChangeVelocityKill);
for (int i = 1; i < _physicsNodes - 1; i++)
@@ -734,6 +721,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);
@@ -750,7 +752,8 @@ public class Rope : MonoBehaviour
SolveDistanceConstraintsSweep_Fast(last - 1, -1, -1, last, sweepStiffness);
}
private void SolveDistanceConstraintsSweep_Fast(int start, int endExclusive, int step, int last, float sweepStiffness)
private void SolveDistanceConstraintsSweep_Fast(int start, int endExclusive, int step, int last,
float sweepStiffness)
{
for (int i = start; i != endExclusive; i += step)
{
@@ -787,6 +790,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 +956,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 +967,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 +984,6 @@ public class Rope : MonoBehaviour
}
int idx = 0;
int last = _physicsNodes - 1;
for (int seg = 0; seg < last; seg++)
{
@@ -975,10 +994,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 +1020,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;
@@ -1066,4 +1094,4 @@ public class Rope : MonoBehaviour
for (int i = 0; i < _physicsNodes; i++)
Gizmos.DrawSphere(_pCurr[i], 0.01f);
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 1330e7f73f804eea8ae09724f6bb1039
timeCreated: 1766759962

View File

@@ -1,55 +0,0 @@
// using Obi;
using UnityEngine;
public class RodLine : MonoBehaviour
{
// private ObiRope obiRope;
private LineRenderer lineRenderer;
private Transform[] points;
public void GenerateLineRendererRope(Transform[] points, float thickness)
{
if (points.Length < 2)
{
Debug.LogError("LineRenderer requires at least two points.");
return;
}
this.points = points;
if (lineRenderer == null)
{
lineRenderer = base.gameObject.GetComponent<LineRenderer>();
if (lineRenderer == null)
{
lineRenderer = base.gameObject.AddComponent<LineRenderer>();
}
}
lineRenderer.positionCount = points.Length;
lineRenderer.startWidth = thickness;
lineRenderer.endWidth = thickness;
for (int i = 0; i < points.Length; i++)
{
lineRenderer.SetPosition(i, points[i].position);
}
}
private void LateUpdate()
{
if (lineRenderer == null)
{
return;
}
for (var i = 0; i < points.Length; i++)
{
var point = points[i];
if (point)
{
lineRenderer.SetPosition(i, point.position);
}
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 5625b86b9e4b4482b82d83b962d0c873
timeCreated: 1766759973

View File

@@ -15,35 +15,35 @@ 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:
RecentlyUsedSceneGuid-3:
value: 54070c5452075002590c0871127b5a4443161c2f797176312c2f1e6bb1b4353d
flags: 0
RecentlyUsedSceneGuid-6:
RecentlyUsedSceneGuid-4:
value: 5309035757065a0a54575f7216265c4444151d28792e72627d2f1935bbb8673a
flags: 0
RecentlyUsedSceneGuid-7:
RecentlyUsedSceneGuid-5:
value: 00050c5150005f5f54560f2640270d4410161c28282b72357e7c4835e4b63760
flags: 0
RecentlyUsedSceneGuid-8:
RecentlyUsedSceneGuid-6:
value: 06090c5f54015f5a0f085b7b11765d444e4e1e287429773178704561b3b23561
flags: 0
RecentlyUsedSceneGuid-9:
RecentlyUsedSceneGuid-7:
value: 0257035f51050d090f0f5d734521094414164e797e7a20667d7a4536e0e36461
flags: 0
RecentlyUsedSceneGuid-8:
value: 5505015f5c515a085f5b092149760f441716407a787d7564287b1b36e7e1366e
flags: 0
RecentlyUsedSceneGuid-9:
value: 07060c5454040c0a545b547240700a441216417e7f2e7268752c4966b4b0663d
flags: 0
UnityEditor.ShaderGraph.Blackboard:
value: 18135939215a0a5004000b0e15254b524c030a3f2964643d120d1230e9e93a3fd6e826abbd2e2d293c4ead313b08042de6030a0afa240c0d020be94c4ba75e435d8715fa32c70d15d11612dacc11fee5d3c5d1fe9ab1bf968e93e2ffcbc3e7e2f0b3ffe0e8b0be9afeffa9ffff8e85dd8390e2969e8899daa7
flags: 0