void Update() { // if hook is out, display rope if (player.activeSelf && hook.activeSelf) { // if hook is latched, stretch rope according to rope length if (grapple.Hooked()) { SetRopeActive(Mathf.Max(1, (int)(grapple.GetRopeDistance() / segmentLength))); transform.localScale = new Vector3(transform.localScale.x, (hook.transform.position - player.transform.position).magnitude / ropeLength, transform.localScale.z); } // else, do not scale rope and add segments according to distance from player else { SetRopeActive((int)((hook.transform.position - player.transform.position).magnitude / segmentLength)); transform.localScale = new Vector3(transform.localScale.x, 1f, transform.localScale.z); } //set rotation and position transform.position = hook.transform.position; transform.up = player.transform.position - hook.transform.position; } // else, hide rope else { SetRopeActive(0); } }
void FixedUpdate() { // move player if grapples are hooked onto something // check player is far enough from the grapple to move based on rope distance if (grapplingHook1.activeSelf && grapple1.Hooked()) { Vector3 gr1dir = grapplingHook1.transform.position - transform.position; rb.AddForce(grappleForce * gr1dir.normalized * (Mathf.Max(gr1dir.magnitude - grapple1.GetRopeDistance(), 0))); // kill velocity in direction away from hook Vector2 normal = -gr1dir.normalized; if (gr1dir.magnitude > grapple1.GetRopeDistance()) { float dot = Vector3.Dot(rb.velocity, normal); if (dot > 0f) { rb.velocity -= normal * dot; } } } if (grapplingHook2.activeSelf && grapple2.Hooked()) { Vector3 gr2dir = grapplingHook2.transform.position - transform.position; rb.AddForce(grappleForce * gr2dir.normalized * (Mathf.Max(gr2dir.magnitude - grapple2.GetRopeDistance(), 0))); // kill velocity in direction away from hook Vector2 normal = -gr2dir.normalized; if (gr2dir.magnitude > grapple2.GetRopeDistance()) { float dot = Vector3.Dot(rb.velocity, normal); if (dot > 0f) { rb.velocity -= normal * dot; } } } }