- Home /
Creating a dynamic fishing line with line rendering, but the last segment is stiff?
I'm trying to get a good fishing line working - and it feels like it's almost there. Following an old Reddit post in the Unity sub, I was able to take the advice and write a class that has a starting point, end point, and draws a curving line between them.
However, there are two problems with the line. The first is that it 'bounces' heavily when it's first started, and the second is that while it -almost- works, I can't seem to get the last segment to flow like the rest. It attaches to the target, but it looks stiff while the remainder of the fishing line moves correctly. How can I fix these issues?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Line : MonoBehaviour {
public LineRenderer lineRenderer;
LineParticle[] lineLength;
public Transform targetObject;
public float lineRest = 0.8f;
public int lineSegmentCount = 30;
private Transform tc;
private void Awake()
{
lineRenderer = GetComponent<LineRenderer>();
tc = transform;
}
public void Start()
{
lineRenderer.positionCount = lineSegmentCount;
lineLength = new LineParticle[lineSegmentCount];
for(int i = 0; i < lineSegmentCount; i++)
{
lineLength[i] = new LineParticle();
}
}
private void Verlet(LineParticle p, float dt)
{
Vector3 temp = p.pos;
p.pos += p.pos - p.oldPos + (p.Accel * dt * dt);
p.oldPos = temp;
}
private void PoleConstraint(LineParticle p1, LineParticle p2, float restLength)
{
Vector3 delta = p2.pos - p1.pos;
float deltaLength = delta.magnitude;
float diff = (deltaLength - restLength) / deltaLength;
p1.pos += delta * diff * .5f;
p2.pos -= delta * diff * .5f;
}
private void LateUpdate()
{
lineLength[0].pos = tc.position;
for (int i = 0; i < lineLength.Length; i++)
{
LineParticle lp = lineLength[i];
Verlet(lp, 0.8f * Time.deltaTime);
int testLP = i + 1;
for (int y = 0; y < 6; y++)
{
if (testLP < lineLength.Length - 1)
{
LineParticle lp2 = lineLength[testLP];
PoleConstraint(lp, lp2, lineRest);
}
if (i == lineSegmentCount - 1)
{
lineLength[i].pos = targetObject.position;
}
lineRenderer.SetPosition(i, lp.pos);
}
}
}
}
public class LineParticle {
public Vector3 pos;
public Vector3 oldPos;
public Vector3 Accel = new Vector3(0, 0, 0);
}
Your answer
Follow this Question
Related Questions
line renderer collision detection in 3D 0 Answers
How can i create a character like dragon hill game, Digging underground, what collider should i use? 0 Answers
Hinge Joint Giving Fake 'Slack' 0 Answers
Rope / cloth like effect 0 Answers
Wrestling Ring Ropes 2 Answers