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);
     }
 }
예제 #2
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;
                }
            }
        }
    }