Creating a Rope Connected to Two GameObjects Through Code

What I need assistance with:

  • I need to create a rope connecting two GameObjects together at runtime through code.

  • One end will be connected to Transform _pointA and the other will be connected to Transform _pointB.

  • I’ve divided the rope up into segments of GameObjects that have a Hinge joint 2D & a Rigidbody 2D.

  • Each segment uses the prior segment’sRigidbody 2D as the Connected Rigid Body.

  • Then I set positions on the LineRenderer to match the segment positions so that I can later use rope material to make it looks nicer.

Issue:

  • When the rope is initially created, it immediately falls straight down creating a vertical rope rather than a horizontal rope, even though the final rope segment is positioned at _pointB with the correct parent’s Rigidbody connected.
  • After a few moments, the rope falls apart without moving any positions manually.
  • Additionally, if the rope is manually moved, it immediately falls apart.
  • To demonstrate the issue, I added a circle sprite to each segment GameObject in the rope.

  • Which causes the line to look like this:

Here’s an example of how I would like it to look when moving the two objects further/closer:

The Code I’m Using:

public class Rope: MonoBehaviour
{

    [SerializeField] private LineRenderer _line;
    [SerializeField, Range(2, 50)] int _segmentCount = 2;

    [SerializeField] private Transform _pointA;
    [SerializeField] private Transform _pointB;

    [SerializeField] HingeJoint2D _hingeJoint;

    public Transform[] segments;
    private void Start()
    {
        GenerateRope();
    }
    // Update is called once per frame
    void Update()
    {
        SetEndOfRopePositions();
        SetLinePoints();
    }

    private void SetEndOfRopePositions()
    {
        segments[0].position = _pointA.position;
        segments[segments.Length - 1].position = _pointB.position;
    }

    private void SetLinePoints()
    {
        _line.positionCount = segments.Length;

        for (int i = 0; i < segments.Length; i++)
        {
            _line.SetPosition(i, segments[i].position);
        }
    }
    private Vector2 GetSegmentPosition(int segmentIndex)
    {
        Vector2 posA = _pointA.position;
        Vector2 posB = _pointB.position;

        float fraction = 1f / (float)_segmentCount;
        return Vector2.Lerp(posA, posB, fraction * segmentIndex);
    }
    void GenerateRope()
    {
        segments = new Transform[_segmentCount];

        for (int i = 0; i < _segmentCount; i++)
        {

            var currJoint = Instantiate(_hingeJoint, GetSegmentPosition(i), Quaternion.identity, this.transform);
            segments[i] = currJoint.transform;

            if (i > 0) // Not first hinge
            {
                int prevIndex = i - 1;
                currJoint.connectedBody = segments[prevIndex].GetComponent<Rigidbody2D>();
            }
        }
    }

}

Inspector for Rope + Segment GameObjects before running the game:

Additional info: If it helps, I just need the rope to droop and straighten like an actual rope when the ends move closer and farther from each other. I don’t need any other physics from the objects roped together as I would like to do all of the movement manually through code.

I only briefly looked through it, but maybe give the segments less mass? 200 seems like a lot.

Unfortunately, the same thing happens even when using a small number like 10 for the mass:(