private void AttachRope() { Player.Crosshair.gameObject.SetActive(false); Player.MyRopeLineRenderer.gameObject.SetActive(true); Player.RopeHingeAnchor.gameObject.SetActive(true); RaycastHit2D hit = Physics2D.Raycast(PlayerPosition, AimDirection, PlayerData.ropeMaxCastDistance, PlayerData.whatCanYouAttachTo); if (hit.collider != null) { RopeAttached = true; PlayerPosition = Player.transform.position; AddForceAfterRopeAttaching(hit.point); if (!RopePositions.Contains(hit.point)) { RopePositions.Add(hit.point); Player.RopeJoint.distance = Vector2.Distance(PlayerPosition, hit.point); Player.RopeJoint.enabled = true; Player.RopeHingeAnchorSpriteRenderer.enabled = true; } } else { RopeAttached = false; IsAiming = false; IsHoldingRope = false; Player.RopeJoint.enabled = false; Player.RopeHingeAnchorSpriteRenderer.enabled = false; } }
private void WrapRopeAroundObjects() { if (RopePositions.Count == 0) { return; } Vector2 lastRopePoint = RopePositions.Last(); RaycastHit2D playerToCurrentNextHit = Physics2D.Raycast(PlayerPosition, (lastRopePoint - PlayerPosition).normalized, Vector2.Distance(PlayerPosition, lastRopePoint) - 0.1f, PlayerData.whatCanYouAttachTo); if (playerToCurrentNextHit) { CompositeCollider2D platformsCollider = playerToCurrentNextHit.collider as CompositeCollider2D; if (platformsCollider != null) { Vector2 closestPointToHit = platformsCollider.bounds.ClosestPoint(playerToCurrentNextHit.point); if (WrapPointsLookup.ContainsKey(closestPointToHit)) { Player.OnRopeStateFinish.ResetRope(); } else { RopePositions.Add(closestPointToHit); WrapPointsLookup.Add(closestPointToHit, 0); _distanceSet = false; } } } }