Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- public class GravityGun : MonoBehaviour
- {
- [SerializeField] Camera cam;
- [SerializeField] Transform objectHolder;
- [SerializeField] float maxGrabDistance = 10f;
- [SerializeField] float holdForce = 500f;
- [SerializeField] float damping = 10f;
- [SerializeField] float throwForce = 20f;
- [SerializeField] Collider playerCollider;
- Collider grabbedCollider;
- Rigidbody grabbedRb;
- void Awake()
- {
- // playerCollider = GetComponentInChildren<Collider>();
- }
- void FixedUpdate()
- {
- if (grabbedRb)
- {
- Vector3 toTarget = objectHolder.position - grabbedRb.position;
- float distance = toTarget.magnitude;
- // Apply velocity to follow the holder
- Vector3 velocity = toTarget * holdForce * Time.fixedDeltaTime;
- grabbedRb.linearVelocity = velocity;
- // Optional damping
- grabbedRb.linearVelocity = Vector3.Lerp(grabbedRb.linearVelocity, Vector3.zero, Time.fixedDeltaTime * damping);
- }
- }
- void Update()
- {
- if (Input.GetKeyDown(KeyCode.F))
- {
- if (grabbedRb) Drop();
- else TryGrab();
- }
- if (grabbedRb && Input.GetMouseButtonDown(0))
- {
- Throw();
- }
- }
- void TryGrab()
- {
- Ray ray = cam.ViewportPointToRay(new Vector3(0.5f, 0.5f));
- if (Physics.Raycast(ray, out RaycastHit hit, maxGrabDistance))
- {
- Rigidbody rb = hit.rigidbody;
- if (rb)
- {
- grabbedRb = rb;
- grabbedRb.useGravity = false;
- grabbedRb.linearDamping = 10f;
- grabbedCollider = grabbedRb.GetComponent<Collider>();
- // if (playerCollider && grabbedCollider)
- // {
- // Physics.IgnoreCollision(playerCollider, grabbedCollider, true);
- // }
- }
- }
- }
- void Drop()
- {
- if (!grabbedRb) return;
- grabbedRb.useGravity = true;
- grabbedRb.linearDamping = 0f;
- grabbedRb = null;
- if (playerCollider && grabbedCollider)
- {
- Physics.IgnoreCollision(playerCollider, grabbedCollider, false);
- }
- }
- void Throw()
- {
- if (!grabbedRb) return;
- grabbedRb.useGravity = true;
- grabbedRb.linearDamping = 0f;
- grabbedRb.AddForce(cam.transform.forward * throwForce, ForceMode.VelocityChange);
- grabbedRb = null;
- if (playerCollider && grabbedCollider)
- {
- Physics.IgnoreCollision(playerCollider, grabbedCollider, false);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment