public void Rope_ObjectWrapping(RopeBase sender, ObjectWrapEventArgs args) { if (args.WrapPoints.Length == 0) { return; } var newRope = Instantiate(RopeInstance1).GetComponent <Rope>(); _ropes.Add(newRope); // Don't want to wrap args.Cancel = true; // Set new rope ends newRope.FrontEnd.transform.position = args.WrapPoints[0]; newRope.BackEnd.transform.position = _sourceRope.BackEnd.transform.position; // Refresh piece ends positions by rope ends from previous two lines. The rope has only one piece. FrontBandPoint corresponds the FrontEnd. BackBandPoint corresponds the BackEnd. newRope.FrontPiece.FrontBandPoint.SetPointInWorldSpace(0f); newRope.FrontPiece.BackBandPoint.SetPointInWorldSpace(0f); // Call the method below to recalculate length newRope.FrontPiece.Relocate(); // Setting Anchoring mode will constrain current rope length newRope.AnchoringMode = AnchoringMode.ByFrontEnd; // Temporary off anchoring mode _sourceRope.AnchoringMode = AnchoringMode.None; // Use native function to shrink the rope _sourceRope.CutRopeNotAnchoring((args.WrapPoints[0] - _sourceRope.BackEnd.transform.position).magnitude, Direction.BackToFront); // Need to call this method to reset previouse position of piece and stabilize the rope _sourceRope.FrontPiece.Relocate(); // Set anchoring mode to accept new length of rope _sourceRope.AnchoringMode = AnchoringMode.ByFrontEnd; var projectile = args.Target.GetComponent <Rigidbody>(); var projectileVeloc = projectile.GetPointVelocity(args.Target.transform.position).magnitude *(args.WrapPoints[0] - args.Target.transform.position); var weigh = _sourceRope.BackEnd.GetComponent <Rigidbody>(); weigh.AddForce(projectileVeloc * 2, ForceMode.VelocityChange); weigh = newRope.FrontEnd.GetComponent <Rigidbody>(); weigh.AddForce(projectileVeloc * 4, ForceMode.VelocityChange); }