using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ItemGrabber : MonoBehaviour { public Transform CameraTransform; public Transform HandTransform; public Transform TorchHandTransform; public CanvasGroup PrimaryIndicator; public Text PrimaryText; public CanvasGroup SecondaryIndicator; public Text SecondaryText; public LayerMask ItemLayer; public LayerMask DroppingRaycastMask; public float Distance; public float ThrowVelocity; [Header("Prefabs")] public GameObject TorchPrefab; [Header("Runtime values")] public List GrabbedItems; public Torch Torch; private void Start() { PrimaryIndicator.alpha = 0; SecondaryIndicator.alpha = 0; } private void Update() { Item Item = null; Campfire Campfire = null; RaycastHit Hit; Vector3 From = CameraTransform.position; Vector3 Direction = CameraTransform.forward; 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, new Vector3(Random.value - 0.5f, Random.value - 0.5f, Random.value - 0.5f) * 0.1f); GrabbedItems.Add(Item); } if (GrabbedItems.Count > 0) { if (Physics.Raycast(From, Direction, out Hit, Distance * 2f, 1 << LayerMask.NameToLayer("Campfire")) && Hit.collider.attachedRigidbody != null) { Campfire = Hit.collider.attachedRigidbody.GetComponent(); } if (Campfire != null && Torch == null && Input.GetButtonDown("Ignite")) { Item GrabbedItem = GrabbedItems[0]; GrabbedItems.RemoveAt(0); GameObject TorchObj = Instantiate(TorchPrefab, GrabbedItem.transform.position, GrabbedItem.transform.rotation, TorchHandTransform); Torch = TorchObj.GetComponent(); Destroy(GrabbedItem.gameObject); } if (Input.GetButtonDown("Grab") && Item == null) { Vector3 DropPosition; if (Campfire != null) { DropPosition = Campfire.transform.position + Vector3.up * 0.7f; } else { if (Physics.Raycast(From, Direction, out Hit, Distance * 2f, DroppingRaycastMask)) { DropPosition = Hit.point + Hit.normal * 0.1f; } else { DropPosition = From + Direction * Distance; } } GrabbedItems[0].Drop(DropPosition); GrabbedItems.RemoveAt(0); } } PrimaryIndicator.alpha = Mathf.Lerp(PrimaryIndicator.alpha, Item != null || Campfire != null ? 1 : 0, 10f * Time.deltaTime); if (Campfire != null && GrabbedItems.Count > 0) { PrimaryText.text = $"Burn {GrabbedItems[0].name.ToLower()}"; } else if (Item != null) { PrimaryText.text = $"Take {Item.name.ToLower()}"; } SecondaryIndicator.alpha = Mathf.Lerp(SecondaryIndicator.alpha, Campfire != null && GrabbedItems.Count > 0 && Torch == null ? 1 : 0, 10f * Time.deltaTime); if (GrabbedItems.Count > 0) { SecondaryText.text = $"Ignite {GrabbedItems[0].name.ToLower()}"; } } }