using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ItemGrabber : MonoBehaviour { public Transform CameraTransform; public Transform HandTransform; public CanvasGroup GrabHint; public Text GrabText; public LayerMask ItemLayer; public LayerMask DroppingRaycastMask; public float Distance; public float ThrowVelocity; [Header("Runtime values")] public Item GrabbedItem; private void Awake() { if (GrabHint == null) { Debug.LogWarning("Player's GrabHint is not set, and pick ups will not be indicated."); } if (GrabText == null) { Debug.LogWarning("Player's GrabText is not set, and pick up texts will not necessarily match the object."); } } private void Update() { Item Item = null; RaycastHit Hit; Vector3 From = CameraTransform.position; Vector3 Direction = CameraTransform.forward; if (GrabbedItem == null) { Debug.DrawLine(From, From + Direction * Distance, Color.red); if (Physics.Raycast(From, Direction, out Hit, Distance, ItemLayer) && Hit.collider.attachedRigidbody != null) { Item = Hit.collider.attachedRigidbody.GetComponent(); } if (Item != null && Input.GetButtonDown("Grab")) { Item.PickUp(HandTransform); GrabbedItem = Item; } } else if (Input.GetButtonDown("Grab")) { Vector3 DropPosition; if (Physics.Raycast(From, Direction, out Hit, Distance * 2f, DroppingRaycastMask)) { DropPosition = Hit.point + Hit.normal * 0.1f; } else { DropPosition = From + Direction * Distance; } GrabbedItem.Drop(DropPosition); GrabbedItem = null; } if (GrabHint != null) { GrabHint.alpha = Mathf.Lerp(GrabHint.alpha, Item != null ? 1 : 0, 10f * Time.deltaTime); } if (Item != null && GrabText != null) { GrabText.text = $"Take {Item.name}"; } } }