line修改
This commit is contained in:
@@ -14,7 +14,6 @@ namespace NBF
|
||||
public LineType LineType;
|
||||
|
||||
[SerializeField] private bool isLureConnect;
|
||||
[SerializeField] private RodLine rodLine;
|
||||
|
||||
/// <summary>
|
||||
/// 主线
|
||||
|
||||
@@ -14,13 +14,13 @@ namespace NBF
|
||||
Tail
|
||||
}
|
||||
|
||||
private FLine _solver;
|
||||
[SerializeField] private FLine _solver;
|
||||
|
||||
[Header("Node")] [SerializeField] private NodeType nodeType = NodeType.Tail;
|
||||
[SerializeField] public Rigidbody body;
|
||||
[SerializeField] private Rope _rope;
|
||||
public Rope Rope;
|
||||
[SerializeField] private MonoBehaviour interaction;
|
||||
private ConfigurableJoint _joint;
|
||||
[SerializeField] private ConfigurableJoint _joint;
|
||||
|
||||
[Header("Segment To Next Logical Node")] [Min(0f)] [SerializeField]
|
||||
private float segmentLengthToNext = 0.5f;
|
||||
@@ -63,8 +63,8 @@ namespace NBF
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
_solver = GetComponentInParent<FLine>();
|
||||
_joint = GetComponent<ConfigurableJoint>();
|
||||
if (!_solver) _solver = GetComponentInParent<FLine>();
|
||||
if (!_joint) _joint = GetComponent<ConfigurableJoint>();
|
||||
EnsureFeatureCache();
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ namespace NBF
|
||||
if (!Mathf.Approximately(lenght, _joint.linearLimit.limit))
|
||||
{
|
||||
_joint.linearLimit = new SoftJointLimit() { limit = lenght };
|
||||
_rope.SetTargetLength(lenght - 0.1f);
|
||||
Rope.SetTargetLength(lenght - 0.1f);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -37,8 +37,14 @@ namespace NBF
|
||||
// });
|
||||
}
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
InitRenderer();
|
||||
GetComponentsInChildren<Transform>(includeInactive: true).ToList().ForEach(delegate(Transform i)
|
||||
{
|
||||
i.gameObject.SetActive(true);
|
||||
@@ -268,5 +274,33 @@ namespace NBF
|
||||
}
|
||||
|
||||
#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.startAnchor = node.Joint.connectedBody;
|
||||
rope.endAnchor = node.body;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -14,19 +14,19 @@ 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;
|
||||
@@ -46,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;
|
||||
@@ -58,7 +58,7 @@ 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, Min(0f)] private float groundRadius = 0.01f;
|
||||
@@ -72,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;
|
||||
@@ -80,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;
|
||||
@@ -135,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;
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1330e7f73f804eea8ae09724f6bb1039
|
||||
timeCreated: 1766759962
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5625b86b9e4b4482b82d83b962d0c873
|
||||
timeCreated: 1766759973
|
||||
Reference in New Issue
Block a user