I have a rope that made by Velvet Integration method
It have Line renderer that have positions points
So to have the rope interact with other objects i need to provide the same line point positions as in line renderer to edge collider
How can I manage that? Please try to help
Here is the Script:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RopeScript : MonoBehaviour
{
private LineRenderer lineRenderer;
private List ropeSegments = new List();
private float ropeSegLen = 0.25f;
private int segmentLength = 35;
private float lineWidth = 0.1f;
// Use this for initialization
void Start()
{
this.lineRenderer = this.GetComponent();
Vector3 ropeStartPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
for (int i = 0; i < segmentLength; i++)
{
this.ropeSegments.Add(new RopeSegment(ropeStartPoint));
ropeStartPoint.y -= ropeSegLen;
}
}
// Update is called once per frame
void Update()
{
this.DrawRope();
}
private void FixedUpdate()
{
this.Simulate();
}
private void Simulate()
{
// SIMULATION
Vector2 forceGravity = new Vector2(0f, -1.5f);
for (int i = 1; i < this.segmentLength; i++)
{
RopeSegment firstSegment = this.ropeSegments[i];
Vector2 velocity = firstSegment.posNow - firstSegment.posOld;
firstSegment.posOld = firstSegment.posNow;
firstSegment.posNow += velocity;
firstSegment.posNow += forceGravity * Time.fixedDeltaTime;
this.ropeSegments[i] = firstSegment;
}
//CONSTRAINTS
for (int i = 0; i < 50; i++)
{
this.ApplyConstraint();
}
}
private void ApplyConstraint()
{
//Constrant to Mouse
RopeSegment firstSegment = this.ropeSegments[0];
firstSegment.posNow = Camera.main.ScreenToWorldPoint(Input.mousePosition);
this.ropeSegments[0] = firstSegment;
for (int i = 0; i < this.segmentLength - 1; i++)
{
RopeSegment firstSeg = this.ropeSegments[i];
RopeSegment secondSeg = this.ropeSegments[i + 1];
float dist = (firstSeg.posNow - secondSeg.posNow).magnitude;
float error = Mathf.Abs(dist - this.ropeSegLen);
Vector2 changeDir = Vector2.zero;
if (dist > ropeSegLen)
{
changeDir = (firstSeg.posNow - secondSeg.posNow).normalized;
}
else if (dist < ropeSegLen)
{
changeDir = (secondSeg.posNow - firstSeg.posNow).normalized;
}
Vector2 changeAmount = changeDir * error;
if (i != 0)
{
firstSeg.posNow -= changeAmount * 0.5f;
this.ropeSegments[i] = firstSeg;
secondSeg.posNow += changeAmount * 0.5f;
this.ropeSegments[i + 1] = secondSeg;
}
else
{
secondSeg.posNow += changeAmount;
this.ropeSegments[i + 1] = secondSeg;
}
}
}
private void DrawRope()
{
float lineWidth = this.lineWidth;
lineRenderer.startWidth = lineWidth;
lineRenderer.endWidth = lineWidth;
Vector3[] ropePositions = new Vector3[this.segmentLength];
for (int i = 0; i < this.segmentLength; i++)
{
ropePositions[i] = this.ropeSegments[i].posNow;
}
lineRenderer.positionCount = ropePositions.Length;
lineRenderer.SetPositions(ropePositions);
}
public struct RopeSegment
{
public Vector2 posNow;
public Vector2 posOld;
public RopeSegment(Vector2 pos)
{
this.posNow = pos;
this.posOld = pos;
}
}
}
↧