Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. We’re making changes to the Unity Runtime Fee pricing policy that we announced on September 12th. Access our latest thread for more information!
    Dismiss Notice
  3. Dismiss Notice

Resolved Pick Up Objects With New Input System

Discussion in 'Input System' started by tysongrunter, Mar 25, 2023.

  1. tysongrunter

    tysongrunter

    Joined:
    Mar 25, 2023
    Posts:
    19
    Okay, I am working on a 3D video game. I am using the new input system, and I am working on context-sensitive controls. The idea is that when you press C, the player will pick up an object with the Grabbable tag, and be able to carry them around. Press C again to drop the object, and press X (which is used for attacking when empty-handed) to throw the object. Here is my code to do so with C# (warning: long):
    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEngine.InputSystem;
    5.  
    6. public class Player : MonoBehaviour
    7. {
    8.     //holds the rigidbody
    9.     [SerializeField]
    10.     Rigidbody rb;
    11.     //holds Kaitlyn's max speed while walking
    12.     [SerializeField]
    13.     float WalkSpeed;
    14.     //holds the direction Kaitlyn moves in
    15.     private Vector3 forceDirection = Vector3.zero;
    16.     //holds Kaitlyn's terminal velocity
    17.     [SerializeField]
    18.     float terminalVelocity;
    19.     //holds the player's controls
    20.     [SerializeField]
    21.     private PlayerControls controls;
    22.     //holds the movement
    23.     [SerializeField]
    24.     private InputAction move;
    25.     //holds the force Kaitlyn applies to herself while moving
    26.     [SerializeField]
    27.     private float movementForce;
    28.     //holds the camera
    29.     [SerializeField]
    30.     private Camera playerCamera;
    31.     //holds Kaitlyn's jump force
    32.     [SerializeField]
    33.     float JumpForce;
    34.     //holds the player's capsule collider
    35.     [SerializeField]
    36.     private CapsuleCollider capsule;
    37.     //holds the player's attack strength
    38.     public int strength;
    39.     //accesses the transform that Kaitlyn gives to the items she grabs
    40.     [SerializeField]
    41.     public Transform holdSpace;
    42.     //checks if Kaitlyn is not holding something
    43.     [SerializeField]
    44.     private bool emptyHand;
    45.     //stores the rigidbody of the object picked up
    46.     [SerializeField]
    47.     Rigidbody _heldObject;
    48.     //holds the spring force of throwable objects
    49.     [SerializeField]
    50.     float springForce;
    51.     //holds the damping force of throwable objects
    52.     [SerializeField]
    53.     float dampingForce;
    54.  
    55.     //gets Kaitlyn's rigidbody, collider, and controls
    56.     void Awake()
    57.     {
    58.         rb = GetComponent<Rigidbody>();
    59.         controls = new PlayerControls();
    60.         capsule = GetComponent<CapsuleCollider>();
    61.         emptyHand = true;
    62.     }
    63.  
    64.     //enables Kaitlyn's moveset
    65.     private void OnEnable()
    66.     {
    67.         controls.Kaitlyn.Jump.started += DoJump;
    68.         controls.Kaitlyn.Crouch.started += DoCrouch;
    69.         controls.Kaitlyn.Crouch.canceled += DoStand;
    70.         controls.Kaitlyn.Sprint.started += DoSprint;
    71.         controls.Kaitlyn.Sprint.canceled += DoStand;
    72.         controls.Kaitlyn.Attack.started += DoAttack;
    73.         controls.Kaitlyn.Grab.started += DoGrab;
    74.         move = controls.Kaitlyn.Move;
    75.         controls.Kaitlyn.Enable();
    76.     }
    77.  
    78.     //disables Kaitlyn's moveset
    79.     private void OnDisable()
    80.     {
    81.         controls.Kaitlyn.Jump.started -= DoJump;
    82.         controls.Kaitlyn.Crouch.started -= DoCrouch;
    83.         controls.Kaitlyn.Crouch.canceled -= DoStand;
    84.         controls.Kaitlyn.Sprint.started -= DoSprint;
    85.         controls.Kaitlyn.Sprint.canceled -= DoStand;
    86.         controls.Kaitlyn.Attack.started -= DoAttack;
    87.         controls.Kaitlyn.Grab.started -= DoGrab;
    88.         controls.Kaitlyn.Disable();
    89.     }
    90.  
    91.     private void FixedUpdate()
    92.     {
    93.         //holds Kaitlyn's movement
    94.         forceDirection += move.ReadValue<Vector2>().x * GetCameraRight(playerCamera) * movementForce;
    95.         forceDirection += move.ReadValue<Vector2>().y * GetCameraForward(playerCamera) * movementForce;
    96.         //applies force to Kaitlyn
    97.         rb.AddForce(forceDirection, ForceMode.Impulse);
    98.         forceDirection = Vector3.zero;
    99.         //lets Kaitlyn fall with gravity
    100.         if(rb.velocity.y < 0f)
    101.         {
    102.             rb.velocity -= Vector3.down * Physics.gravity.y * Time.fixedDeltaTime;
    103.         }
    104.         //holds Kaitlyn's horizontal velocity
    105.         Vector3 horizontalVelocity = rb.velocity;
    106.         horizontalVelocity.y = 0;
    107.         //stops Kaitlyn from moving faster than her max speed
    108.         if(horizontalVelocity.sqrMagnitude > WalkSpeed * WalkSpeed)
    109.         {
    110.             rb.velocity = horizontalVelocity.normalized * WalkSpeed + Vector3.up * rb.velocity.y;
    111.         }
    112.         //calls the LookAt() function
    113.         LookAt();
    114.     }
    115.  
    116.     //bases Kaitlyn's X-axis off the camera's
    117.     private Vector3 GetCameraRight(Camera camera)
    118.     {
    119.         Vector3 right = camera.transform.right;
    120.         right.y = 0;
    121.         return right.normalized;
    122.     }
    123.  
    124.     //bases Kaitlyn's Z-axis off the camera's
    125.     private Vector3 GetCameraForward(Camera camera)
    126.     {
    127.         Vector3 forward = camera.transform.forward;
    128.         forward.y = 0;
    129.         return forward.normalized;
    130.     }
    131.  
    132.     //makes Kaitlyn turn in the direction she looks
    133.     private void LookAt()
    134.     {
    135.         Vector3 direction = rb.velocity;
    136.         direction.y = 0f;
    137.         if(move.ReadValue<Vector2>().sqrMagnitude > 0.1f && direction.sqrMagnitude > 0.1f)
    138.         {
    139.             rb.rotation = Quaternion.LookRotation(direction, Vector3.up);
    140.         }
    141.         else
    142.         {
    143.             rb.angularVelocity = Vector3.zero;
    144.         }
    145.     }
    146.  
    147.     //makes Kaitlyn jump, if she is touching the ground
    148.     private void DoJump(InputAction.CallbackContext obj)
    149.     {
    150.         //only lets Kaitlyn jump if she's in contact with the ground
    151.         if (IsGrounded())
    152.         {
    153.             forceDirection += Vector3.up * JumpForce;
    154.         }
    155.     }
    156.  
    157.     //checks if Kaitlyn is standing on solid ground
    158.     private bool IsGrounded()
    159.     {
    160.         //contains the ground check raycast's origin and direction
    161.         Ray ray = new Ray(this.transform.position + Vector3.up, Vector3.down);
    162.         //sets to true if the raycast hits something
    163.         if (Physics.Raycast(ray, out RaycastHit hit, 3f))
    164.         {
    165.             return true;
    166.         }
    167.         //sets to false if it doesn't hit
    168.         else
    169.         {
    170.             return false;
    171.         }
    172.     }
    173.  
    174.     //lets Kaitlyn crouch, reducing her height and top speed
    175.     private void DoCrouch(InputAction.CallbackContext obj)
    176.     {
    177.         capsule.height = 1.5f;
    178.         WalkSpeed = 1f;
    179.         movementForce = 1f;
    180.     }
    181.  
    182.     //lets Kaitlyn stand up straight after crouching or sprinting, resetting her height, top speed, and acceleration
    183.     private void DoStand(InputAction.CallbackContext obj)
    184.     {
    185.         capsule.height = 3f;
    186.         WalkSpeed = 2f;
    187.         movementForce = 1f;
    188.     }
    189.  
    190.     //allows Kaitlyn to run, increasing her top speed and acceleration
    191.     private void DoSprint(InputAction.CallbackContext obj)
    192.     {
    193.         WalkSpeed = 10f;
    194.         movementForce = 2.5f;
    195.     }
    196.  
    197.     //lets Kaitlyn attack
    198.     private void DoAttack(InputAction.CallbackContext obj)
    199.     {
    200.         //sets the origin at the player's position and the direction at in front of Kaitlyn
    201.         Ray ray = new Ray(this.transform.position, this.transform.forward);
    202.         //checks if there's something 1.665 m in front of Kaitlyn
    203.         if (Physics.Raycast(ray, out RaycastHit hit, 1.665f))
    204.         {
    205.             //holds the rigidbody of the grabbable object
    206.             Rigidbody otherRB = hit.rigidbody;
    207.             //gets the rigidbody of the grabbable object
    208.             //otherRB = hit.collider.gameObject.GetComponent<Rigidbody>();
    209.             //checks if that thing is tagged as damageable, and if so, communicates to the damageable script
    210.             if (hit.transform.gameObject.tag == "Damageable" && emptyHand == true)
    211.             {
    212.                 hit.transform.gameObject.SendMessage("TakeDamage", strength);
    213.             }
    214.             //checks if Kaitlyn is holding something
    215.             else if (_heldObject != null)
    216.             {
    217.                 hit.transform.parent = null;
    218.                 otherRB.useGravity = true;
    219.                 emptyHand = true;
    220.                 Vector3 targetDelta = holdSpace.position - _heldObject.position;
    221.                 _heldObject.velocity += (targetDelta * springForce) - (_heldObject.velocity * Time.deltaTime * dampingForce);
    222.             }
    223.         }
    224.     }
    225.  
    226.     //lets Kaitlyn grab objects
    227.     private void DoGrab(InputAction.CallbackContext obj)
    228.     {
    229.         //sets the origin at the player's position and the direction at in front of Kaitlyn
    230.         Ray ray = new Ray(this.transform.position, this.transform.forward);
    231.         //checks if there's something 1.665 m in front of Kaitlyn
    232.         if (Physics.Raycast(ray, out RaycastHit hit, 1.665f))
    233.         {
    234.             //holds the rigidbody of the grabbable object
    235.             Rigidbody otherRB = hit.rigidbody;
    236.             //gets the rigidbody of the grabbable object
    237.             //otherRB = hit.collider.gameObject.GetComponent<Rigidbody>();
    238.             //checks if the grabbable object has an rigidbody
    239.             if(otherRB != null)
    240.             {
    241.                 _heldObject = _heldObject == otherRB ? null : otherRB;
    242.             }
    243.             //checks if that thing is tagged as grabbable, and if Kaitlyn is holding something
    244.             if (hit.transform.gameObject.tag == "Grabbable" && emptyHand == true)
    245.             {
    246.                 hit.transform.SetPositionAndRotation(holdSpace.transform.position, holdSpace.transform.rotation);
    247.                 hit.transform.parent = holdSpace.transform;
    248.                 otherRB.useGravity = false;
    249.                 emptyHand = false;
    250.             }
    251.             //checks if Kaitlyn is holding something
    252.             else if (_heldObject != null)
    253.             {
    254.                 hit.transform.parent = null;
    255.                 otherRB.useGravity = true;
    256.                 emptyHand = true;
    257.             }
    258.         }
    259.     }
    260. }
    261.  
    Anyways, while it can pick up the object I put in my test scene, if I set to turn useGravity off, the object drifts away from the player, and doesn't move with them. And if I were to set it to turn IsKinematic on, it disables the player's movement. What changes to the code would I need, if I were to want the player to be able to pick up, carry, drop, and throw certain objects?
     
  2. tv_Never

    tv_Never

    Joined:
    Nov 11, 2021
    Posts:
    11
    Would this be useful?


    You say the object drifts when picked up. This is because it has velocity. You could just set the velocity to 0 on the object while picked up.
     
    tysongrunter likes this.
  3. tysongrunter

    tysongrunter

    Joined:
    Mar 25, 2023
    Posts:
    19
    Hopefully.

    UPDATE: It works. The player can pick things up, carry them around, and drop them. However, thrown objects are thrown at a diagonal. How do I get it so that the player can throw objects straight ahead? I've been able to implement a parabola.
     
    Last edited: Mar 25, 2023
  4. tv_Never

    tv_Never

    Joined:
    Nov 11, 2021
    Posts:
    11
    I've edited my comment, look at it again
     
  5. tysongrunter

    tysongrunter

    Joined:
    Mar 25, 2023
    Posts:
    19
    I did set velocity and angular velocity to zero upon being grabbed, but it still goes diagonally. What am I doing wrong? Here is my code:
    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. public class Grabbable : MonoBehaviour
    6. {
    7.     [SerializeField]
    8.     private Rigidbody rb;
    9.     [SerializeField]
    10.     private Transform holdSpace;
    11.     [SerializeField]
    12.     private float horizontalForce;
    13.     [SerializeField]
    14.     private float verticalForce;
    15.     [SerializeField]
    16.     private float sidewaysForce;
    17.     [SerializeField]
    18.     private Transform player;
    19.  
    20.     private void Awake()
    21.     {
    22.         rb = GetComponent<Rigidbody>();
    23.     }
    24.  
    25.     public void Grab(Transform holdSpace)
    26.     {
    27.         this.holdSpace = holdSpace;
    28.         rb.useGravity = false;
    29.         rb.velocity = Vector3.zero;
    30.         rb.angularVelocity = Vector3.zero;
    31.     }
    32.  
    33.     private void FixedUpdate()
    34.     {
    35.         if(holdSpace != null)
    36.         {
    37.             float lerpSpeed = 10f;
    38.             Vector3 newPosition = Vector3.Lerp(transform.position, holdSpace.position, Time.deltaTime * lerpSpeed);
    39.             rb.MovePosition(newPosition);
    40.         }
    41.     }
    42.  
    43.     public void Drop()
    44.     {
    45.         this.holdSpace = null;
    46.         rb.useGravity = true;
    47.     }
    48.  
    49.     public void Throw()
    50.     {
    51.         this.holdSpace = null;
    52.         rb.useGravity = true;
    53.         Vector3 forceDirection = player.transform.forward;
    54.         Vector3 sidewaysDirection = player.transform.right;
    55.         RaycastHit hit;
    56.         if(Physics.Raycast(player.position, player.forward, out hit, 100f))
    57.         {
    58.             forceDirection = (hit.point).normalized;
    59.         }
    60.         Vector3 ApplyForce = forceDirection * horizontalForce + transform.up * verticalForce + sidewaysDirection * sidewaysForce;
    61.         rb.AddForce(ApplyForce, ForceMode.Impulse);
    62.     }
    63. }
    64.  
    What changes need to be placed so thrown objects go straight ahead of the player?
     
  6. tysongrunter

    tysongrunter

    Joined:
    Mar 25, 2023
    Posts:
    19
    SOLUTION: I managed to make it work. Here's the Player script I'm using:
    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEngine.InputSystem;
    5.  
    6. public class Player : MonoBehaviour
    7. {
    8.     //holds the rigidbody
    9.     [SerializeField]
    10.     Rigidbody rb;
    11.     //holds Kaitlyn's max speed while walking
    12.     [SerializeField]
    13.     float WalkSpeed;
    14.     //holds the direction Kaitlyn moves in
    15.     private Vector3 forceDirection = Vector3.zero;
    16.     //holds Kaitlyn's terminal velocity
    17.     [SerializeField]
    18.     float terminalVelocity;
    19.     //holds the player's controls
    20.     [SerializeField]
    21.     private PlayerControls controls;
    22.     //holds the movement
    23.     [SerializeField]
    24.     private InputAction move;
    25.     //holds the force Kaitlyn applies to herself while moving
    26.     [SerializeField]
    27.     private float movementForce;
    28.     //holds the camera
    29.     [SerializeField]
    30.     private Camera playerCamera;
    31.     //holds Kaitlyn's jump force
    32.     [SerializeField]
    33.     float JumpForce;
    34.     //holds the player's capsule collider
    35.     [SerializeField]
    36.     private CapsuleCollider capsule;
    37.     //holds the player's attack strength
    38.     public int strength;
    39.     //accesses the transform that Kaitlyn gives to the items she grabs
    40.     public Transform holdSpace;
    41.     //stores the rigidbody of the object picked up
    42.     [SerializeField]
    43.     Rigidbody _heldObject;
    44.     //holds the spring force of throwable objects
    45.     [SerializeField]
    46.     float springForce;
    47.     //holds the damping force of throwable objects
    48.     [SerializeField]
    49.     float dampingForce;
    50.     [SerializeField]
    51.     private Grabbable grabbable;
    52.  
    53.     //gets Kaitlyn's rigidbody, collider, and controls
    54.     void Awake()
    55.     {
    56.         rb = GetComponent<Rigidbody>();
    57.         controls = new PlayerControls();
    58.         capsule = GetComponent<CapsuleCollider>();
    59.     }
    60.  
    61.     //enables Kaitlyn's moveset
    62.     private void OnEnable()
    63.     {
    64.         controls.Kaitlyn.Jump.started += DoJump;
    65.         controls.Kaitlyn.Crouch.started += DoCrouch;
    66.         controls.Kaitlyn.Crouch.canceled += DoStand;
    67.         controls.Kaitlyn.Sprint.started += DoSprint;
    68.         controls.Kaitlyn.Sprint.canceled += DoStand;
    69.         controls.Kaitlyn.Attack.started += DoAttack;
    70.         controls.Kaitlyn.Grab.started += DoGrab;
    71.         move = controls.Kaitlyn.Move;
    72.         controls.Kaitlyn.Enable();
    73.     }
    74.  
    75.     //disables Kaitlyn's moveset
    76.     private void OnDisable()
    77.     {
    78.         controls.Kaitlyn.Jump.started -= DoJump;
    79.         controls.Kaitlyn.Crouch.started -= DoCrouch;
    80.         controls.Kaitlyn.Crouch.canceled -= DoStand;
    81.         controls.Kaitlyn.Sprint.started -= DoSprint;
    82.         controls.Kaitlyn.Sprint.canceled -= DoStand;
    83.         controls.Kaitlyn.Attack.started -= DoAttack;
    84.         controls.Kaitlyn.Grab.started -= DoGrab;
    85.         controls.Kaitlyn.Disable();
    86.     }
    87.  
    88.     //called once a frame
    89.     private void FixedUpdate()
    90.     {
    91.         //holds Kaitlyn's movement
    92.         forceDirection += move.ReadValue<Vector2>().x * GetCameraRight(playerCamera) * movementForce;
    93.         forceDirection += move.ReadValue<Vector2>().y * GetCameraForward(playerCamera) * movementForce;
    94.         //applies force to Kaitlyn
    95.         rb.AddForce(forceDirection, ForceMode.Impulse);
    96.         forceDirection = Vector3.zero;
    97.         //lets Kaitlyn fall with gravity
    98.         if(rb.velocity.y < 0f)
    99.         {
    100.             rb.velocity -= Vector3.down * Physics.gravity.y * Time.fixedDeltaTime;
    101.         }
    102.         //holds Kaitlyn's horizontal velocity
    103.         Vector3 horizontalVelocity = rb.velocity;
    104.         horizontalVelocity.y = 0;
    105.         //stops Kaitlyn from moving faster than her max speed
    106.         if(horizontalVelocity.sqrMagnitude > WalkSpeed * WalkSpeed)
    107.         {
    108.             rb.velocity = horizontalVelocity.normalized * WalkSpeed + Vector3.up * rb.velocity.y;
    109.         }
    110.         //calls the LookAt() function
    111.         LookAt();
    112.     }
    113.  
    114.     //bases Kaitlyn's X-axis off the camera's
    115.     private Vector3 GetCameraRight(Camera camera)
    116.     {
    117.         Vector3 right = camera.transform.right;
    118.         right.y = 0;
    119.         return right.normalized;
    120.     }
    121.  
    122.     //bases Kaitlyn's Z-axis off the camera's
    123.     private Vector3 GetCameraForward(Camera camera)
    124.     {
    125.         Vector3 forward = camera.transform.forward;
    126.         forward.y = 0;
    127.         return forward.normalized;
    128.     }
    129.  
    130.     //makes Kaitlyn turn in the direction she looks
    131.     private void LookAt()
    132.     {
    133.         Vector3 direction = rb.velocity;
    134.         direction.y = 0f;
    135.         if(move.ReadValue<Vector2>().sqrMagnitude > 0.1f && direction.sqrMagnitude > 0.1f)
    136.         {
    137.             rb.rotation = Quaternion.LookRotation(direction, Vector3.up);
    138.         }
    139.         else
    140.         {
    141.             rb.angularVelocity = Vector3.zero;
    142.         }
    143.     }
    144.  
    145.     //makes Kaitlyn jump, if she is touching the ground
    146.     private void DoJump(InputAction.CallbackContext obj)
    147.     {
    148.         //only lets Kaitlyn jump if she's in contact with the ground
    149.         if (IsGrounded())
    150.         {
    151.             forceDirection += Vector3.up * JumpForce;
    152.         }
    153.     }
    154.  
    155.     //checks if Kaitlyn is standing on solid ground
    156.     private bool IsGrounded()
    157.     {
    158.         //contains the ground check raycast's origin and direction
    159.         Ray ray = new Ray(this.transform.position + Vector3.up, Vector3.down);
    160.         //sets to true if the raycast hits something
    161.         if (Physics.Raycast(ray, out RaycastHit hit, 3f))
    162.         {
    163.             return true;
    164.         }
    165.         //sets to false if it doesn't hit
    166.         else
    167.         {
    168.             return false;
    169.         }
    170.     }
    171.  
    172.     //lets Kaitlyn crouch, reducing her height and top speed
    173.     private void DoCrouch(InputAction.CallbackContext obj)
    174.     {
    175.         capsule.height = 1.5f;
    176.         WalkSpeed = 1f;
    177.         movementForce = 1f;
    178.     }
    179.  
    180.     //lets Kaitlyn stand up straight after crouching or sprinting, resetting her height, top speed, and acceleration
    181.     private void DoStand(InputAction.CallbackContext obj)
    182.     {
    183.         capsule.height = 3f;
    184.         WalkSpeed = 2f;
    185.         movementForce = 1f;
    186.     }
    187.  
    188.     //allows Kaitlyn to run, increasing her top speed and acceleration
    189.     private void DoSprint(InputAction.CallbackContext obj)
    190.     {
    191.         WalkSpeed = 10f;
    192.         movementForce = 2.5f;
    193.     }
    194.  
    195.     //lets Kaitlyn attack and throw
    196.     private void DoAttack(InputAction.CallbackContext obj)
    197.     {
    198.         //checks if Kaitlyn's hands are empty
    199.         if(grabbable == null)
    200.         {
    201.             //sets the origin at the player's position and the direction at in front of Kaitlyn
    202.             Ray ray = new Ray(this.transform.position, this.transform.forward);
    203.             //checks if there's something 1.665 m in front of Kaitlyn
    204.             if (Physics.Raycast(ray, out RaycastHit hit, 1.665f))
    205.             {
    206.                 //holds the rigidbody of the grabbable object
    207.                 Rigidbody otherRB = hit.rigidbody;
    208.                 //checks if that thing is tagged as damageable, and if so, communicates to the damageable script
    209.                 if (hit.transform.gameObject.tag == "Damageable")
    210.                 {
    211.                     hit.transform.gameObject.SendMessage("TakeDamage", strength);
    212.                 }
    213.             }
    214.         }
    215.         //throws if Kaitlyn is holding something
    216.         else
    217.         {
    218.             grabbable.Throw();
    219.         }
    220.     }
    221.  
    222.     //lets Kaitlyn grab, carry, and drop objects
    223.     private void DoGrab(InputAction.CallbackContext obj)
    224.     {
    225.         //checks if Kaitlyn's holding something
    226.         if(grabbable == null)
    227.         {
    228.             //sets the origin at the player's position and the direction at in front of Kaitlyn
    229.             Ray ray = new Ray(this.transform.position, this.transform.forward);
    230.             //checks if there's something 1.665 m in front of Kaitlyn
    231.             if (Physics.Raycast(ray, out RaycastHit hit, 1.665f))
    232.             {
    233.                 //grabs if that object in front of Kaitlyn has a grabbable script
    234.                 if(hit.transform.TryGetComponent(out grabbable))
    235.                 {
    236.                     grabbable.Grab(holdSpace);
    237.                 }
    238.             }
    239.         }
    240.         //if Kaitlyn is holding something, she drops it
    241.         else
    242.         {
    243.             grabbable.Drop();
    244.             grabbable = null;
    245.         }
    246.     }
    247. }
    248.  
    And here's the grabbable script I'm using:
    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. public class Grabbable : MonoBehaviour
    6. {
    7.     //holds the grabbable object's rigidbody
    8.     [SerializeField]
    9.     private Rigidbody rb;
    10.     //gets Kaitlyn's hold space
    11.     [SerializeField]
    12.     private Transform holdSpace;
    13.     //holds the forwards force of the thrown object
    14.     [SerializeField]
    15.     private float horizontalForce;
    16.     //holds the upwards force of the thrown object
    17.     [SerializeField]
    18.     private float verticalForce;
    19.     //holds the sideways force of the thrown object
    20.     [SerializeField]
    21.     private float sidewaysForce;
    22.     //holds Kaitlyn's transforms
    23.     [SerializeField]
    24.     private Transform player;
    25.  
    26.     //gets the grabbable object's rigidbody
    27.     private void Awake()
    28.     {
    29.         rb = GetComponent<Rigidbody>();
    30.     }
    31.  
    32.     //places the object within the hold space, once grabbed
    33.     public void Grab(Transform holdSpace)
    34.     {
    35.         this.holdSpace = holdSpace;
    36.         rb.useGravity = false;
    37.         rb.velocity = Vector3.zero;
    38.         rb.angularVelocity = Vector3.zero;
    39.     }
    40.  
    41.     //keeps the grabbed object within the hold space
    42.     private void FixedUpdate()
    43.     {
    44.         if(holdSpace != null)
    45.         {
    46.             float lerpSpeed = 10f;
    47.             Vector3 newPosition = Vector3.Lerp(transform.position, holdSpace.position, Time.deltaTime * lerpSpeed);
    48.             this.transform.rotation = holdSpace.rotation;
    49.             rb.MovePosition(newPosition);
    50.         }
    51.     }
    52.  
    53.     //drops the grabbed object by pressing C
    54.     public void Drop()
    55.     {
    56.         this.holdSpace = null;
    57.         rb.useGravity = true;
    58.     }
    59.  
    60.     //throws the grabbed object by pressing X
    61.     public void Throw()
    62.     {
    63.         this.holdSpace = null;
    64.         rb.useGravity = true;
    65.         Vector3 forceDirection = player.transform.forward;
    66.         Vector3 sidewaysDirection = player.transform.right;
    67.         Vector3 ApplyForce = forceDirection * horizontalForce + transform.up * verticalForce + sidewaysDirection * sidewaysForce;
    68.         rb.AddForce(ApplyForce, ForceMode.Impulse);
    69.     }
    70. }
    71.  
     
    tv_Never likes this.