Guest User

GravityGun

a guest
Jul 23rd, 2025
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.71 KB | None | 0 0
  1. using UnityEngine;
  2.  
  3. public class GravityGun : MonoBehaviour
  4. {
  5.     [SerializeField] Camera cam;
  6.     [SerializeField] Transform objectHolder;
  7.     [SerializeField] float maxGrabDistance = 10f;
  8.     [SerializeField] float holdForce = 500f;
  9.     [SerializeField] float damping = 10f;
  10.     [SerializeField] float throwForce = 20f;
  11.  
  12.     [SerializeField] Collider playerCollider;
  13.     Collider grabbedCollider;
  14.  
  15.     Rigidbody grabbedRb;
  16.  
  17.     void Awake()
  18.     {
  19.         // playerCollider = GetComponentInChildren<Collider>();
  20.     }
  21.  
  22.     void FixedUpdate()
  23.     {
  24.         if (grabbedRb)
  25.         {
  26.             Vector3 toTarget = objectHolder.position - grabbedRb.position;
  27.             float distance = toTarget.magnitude;
  28.  
  29.             // Apply velocity to follow the holder
  30.             Vector3 velocity = toTarget * holdForce * Time.fixedDeltaTime;
  31.             grabbedRb.linearVelocity = velocity;
  32.  
  33.             // Optional damping
  34.             grabbedRb.linearVelocity = Vector3.Lerp(grabbedRb.linearVelocity, Vector3.zero, Time.fixedDeltaTime * damping);
  35.         }
  36.     }
  37.  
  38.     void Update()
  39.     {
  40.         if (Input.GetKeyDown(KeyCode.F))
  41.         {
  42.             if (grabbedRb) Drop();
  43.             else TryGrab();
  44.         }
  45.  
  46.         if (grabbedRb && Input.GetMouseButtonDown(0))
  47.         {
  48.             Throw();
  49.         }
  50.     }
  51.  
  52.     void TryGrab()
  53.     {
  54.         Ray ray = cam.ViewportPointToRay(new Vector3(0.5f, 0.5f));
  55.         if (Physics.Raycast(ray, out RaycastHit hit, maxGrabDistance))
  56.         {
  57.             Rigidbody rb = hit.rigidbody;
  58.             if (rb)
  59.             {
  60.                 grabbedRb = rb;
  61.                 grabbedRb.useGravity = false;
  62.                 grabbedRb.linearDamping = 10f;
  63.  
  64.                 grabbedCollider = grabbedRb.GetComponent<Collider>();
  65.                 // if (playerCollider && grabbedCollider)
  66.                 // {
  67.                 //     Physics.IgnoreCollision(playerCollider, grabbedCollider, true);
  68.                 // }
  69.             }
  70.         }
  71.     }
  72.  
  73.     void Drop()
  74.     {
  75.         if (!grabbedRb) return;
  76.         grabbedRb.useGravity = true;
  77.         grabbedRb.linearDamping = 0f;
  78.         grabbedRb = null;
  79.  
  80.         if (playerCollider && grabbedCollider)
  81.         {
  82.             Physics.IgnoreCollision(playerCollider, grabbedCollider, false);
  83.         }
  84.     }
  85.  
  86.     void Throw()
  87.     {
  88.         if (!grabbedRb) return;
  89.  
  90.         grabbedRb.useGravity = true;
  91.         grabbedRb.linearDamping = 0f;
  92.         grabbedRb.AddForce(cam.transform.forward * throwForce, ForceMode.VelocityChange);
  93.         grabbedRb = null;
  94.  
  95.         if (playerCollider && grabbedCollider)
  96.         {
  97.             Physics.IgnoreCollision(playerCollider, grabbedCollider, false);
  98.         }
  99.     }
  100. }
  101.  
Advertisement
Add Comment
Please, Sign In to add comment