How to build upon Jongallant’s verlet integration rope project?

In order to build 2d rope physics in my game, I download the github project from Jongallant in this link. In my game, I want the rope to collide with objects with differents types of colliders such as box collider or polygon collider.

I made modification to the code of the project file. In Rope script, I have the following lines :

using System.Collections.Generic; using UnityEngine;  public class Rope : MonoBehaviour {     LineRenderer LineRenderer;     Vector3[] LinePositions;      private List<RopeNode> RopeNodes = new List<RopeNode>();     private float NodeDistance = 0.2f;     private int TotalNodes = 50;     private float RopeWidth = 0.1f;      Camera Camera;      int LayerMask = 1;     ContactFilter2D ContactFilter;         RaycastHit2D[] RaycastHitBuffer = new RaycastHit2D[10];     RaycastHit2D[] RaycastHitBuffer1 = new RaycastHit2D[10];     Collider2D[] ColliderHitBuffer = new Collider2D[10];      Vector3 Gravity = new Vector2(0f, -5f);     Vector2 Node1Lock;      void Start()     {         Camera = Camera.main;          ContactFilter = new ContactFilter2D         {             layerMask = LayerMask,             useTriggers = false,         };          LineRenderer = this.GetComponent<LineRenderer>();          // Generate some rope nodes based on properties         Vector3 startPosition = Vector2.zero;         for (int i = 0; i < TotalNodes; i++)         {                         RopeNode node = (GameObject.Instantiate(Resources.Load("RopeNode") as GameObject)).GetComponent<RopeNode>();             node.transform.position = startPosition;             node.PreviousPosition = startPosition;             RopeNodes.Add(node);              startPosition.y -= NodeDistance;         }          // for line renderer data         LinePositions = new Vector3[TotalNodes];     }       void Update()     {         // Attach rope end to mouse click position         if (Input.GetMouseButtonDown(0))         {             Node1Lock = Camera.ScreenToWorldPoint(Input.mousePosition);         }          DrawRope();     }      private void FixedUpdate()     {         Simulate();                                 // Higher iteration results in stiffer ropes and stable simulation         for (int i = 0; i < 80; i++)         {             ApplyConstraint();              // Playing around with adjusting collisions at intervals - still stable when iterations are skipped             if (i % 2 == 1)                 AdjustCollisions();         }     }      private void Simulate()     {         // step each node in rope         for (int i = 0; i < TotalNodes; i++)         {                         // derive the velocity from previous frame             Vector3 velocity = RopeNodes[i].transform.position - RopeNodes[i].PreviousPosition;             RopeNodes[i].PreviousPosition = RopeNodes[i].transform.position;              // calculate new position             Vector3 newPos = RopeNodes[i].transform.position + velocity;             newPos += Gravity * Time.fixedDeltaTime;             Vector3 direction = RopeNodes[i].transform.position - newPos;                                      // cast ray towards this position to check for a collision             int result = -1;             result = Physics2D.CircleCast(RopeNodes[i].transform.position, RopeNodes[i].transform.localScale.x / 2f, -direction.normalized, ContactFilter, RaycastHitBuffer, direction.magnitude);              if (result > 0)             {                 for (int n = 0; n < result; n++)                 {                                         if (RaycastHitBuffer[n].collider.gameObject.layer == 9 || RaycastHitBuffer[n].collider.gameObject.layer == 10)                     {                         Vector2 hitPos = RaycastHitBuffer[n].point;                         newPos = hitPos;                         break;                                                      }                 }             }              RopeNodes[i].transform.position = newPos;         }     }          private void AdjustCollisions()     {         // Loop rope nodes and check if currently colliding         for (int i = 0; i < TotalNodes - 1; i++)         {             RopeNode node = RopeNodes[i];              int result = -1;             result = Physics2D.OverlapCircleNonAlloc(node.transform.position, node.transform.localScale.x / 2f, ColliderHitBuffer);              if (result > 0)             {                 for (int n = 0; n < result; n++)                 {                     if (ColliderHitBuffer[n].gameObject.layer != 8)                     {                         if(ColliderHitBuffer[n].gameObject.layer == 9) {                             // Adjust the rope node position to be outside collision                             Vector3 collidercenter = ColliderHitBuffer[n].transform.position;                             Vector3 collisionDirection = node.transform.position - collidercenter;                              Vector3 hitPos = collidercenter + collisionDirection.normalized * ((ColliderHitBuffer[n].transform.localScale.x / 2f) + (node.transform.localScale.x / 2f));                             node.transform.position = hitPos;                             break;                          } else if (ColliderHitBuffer[n].gameObject.layer == 10) {                              Vector3 velocity = RopeNodes[i].transform.position - RopeNodes[i].PreviousPosition;                                                          Vector3 newPos = RopeNodes[i].transform.position + velocity;                             newPos += Gravity * Time.fixedDeltaTime;                             Vector3 direction = RopeNodes[i].transform.position - newPos;                                                                      int result1 = -1;                             result1 = Physics2D.CircleCast(RopeNodes[i].transform.position, RopeNodes[i].transform.localScale.x / 2f, -direction.normalized, ContactFilter, RaycastHitBuffer1, direction.magnitude);                              if (result1 > 0)                             {                                 for (int m = 0; m < result1; m++)                                 {                                                         if (RaycastHitBuffer1[m].collider.gameObject.layer == 10)                                     {                                         Vector3 collidercenter = ColliderHitBuffer[n].transform.position;                                         Vector3 collisionDirection = node.transform.position - collidercenter;                                          Vector3 raycastHit2DPoint = new Vector3(RaycastHitBuffer1[n].point.x, RaycastHitBuffer1[n].point.y, 0);                                          Vector3 hitPos1 = raycastHit2DPoint + collisionDirection.normalized * (node.transform.localScale.x / 2f);                                         node.transform.position = hitPos1;                                         break;                                               }                                 }                             }                         }                      }                 }             }         }         }      private void ApplyConstraint()     {         // Check if the first node is clamped to the scene or is follwing the mouse         if (Node1Lock != Vector2.zero)         {             RopeNodes[0].transform.position = Node1Lock;         }         else         {             RopeNodes[0].transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);         }          for (int i = 0; i < TotalNodes - 1; i++)         {             RopeNode node1 = RopeNodes[i];             RopeNode node2 = RopeNodes[i + 1];              // Get the current distance between rope nodes             float currentDistance = (node1.transform.position - node2.transform.position).magnitude;             float difference = Mathf.Abs(currentDistance - NodeDistance);             Vector2 direction = Vector2.zero;                         // determine what direction we need to adjust our nodes             if (currentDistance > NodeDistance)             {                 direction = (node1.transform.position - node2.transform.position).normalized;             }             else if (currentDistance < NodeDistance)             {                 direction = (node2.transform.position - node1.transform.position).normalized;             }              // calculate the movement vector             Vector3 movement = direction * difference;              // apply correction             node1.transform.position -= (movement * 0.5f);             node2.transform.position += (movement * 0.5f);         }     }      private void DrawRope()     {         LineRenderer.startWidth = RopeWidth;         LineRenderer.endWidth = RopeWidth;          for (int n = 0; n < TotalNodes; n++)         {             LinePositions[n] = new Vector3(RopeNodes[n].transform.position.x, RopeNodes[n].transform.position.y, 0);         }          LineRenderer.positionCount = LinePositions.Length;         LineRenderer.SetPositions(LinePositions);     }  } 

[ The layer 9 contains the circle collider objects and the layer 10 contains the box collider objects]

But, it is not working as intended ! Here is what I happens : Youtube Video

Can somebody help me please ?