using System.Collections; using System.Collections.Generic; using UnityEngine; public class ItemGrabber : MonoBehaviour { public static ItemGrabber instance; void Awake() { instance = this; } public float pickupDistance; public Pickable currentTarget; public Pickable grabbingItem; public Transform holdingPoint; public Transform scanningItem; public Transform arm; void Update() { ScanForTarget(); CalculateHoldingPointVelocity(); arm.transform.localRotation = arm.transform.localRotation.with(x: Camera.main.transform.localRotation.x); if (currentTarget != null && Input.GetMouseButtonDown(0)) { currentTarget.Grab(); grabbingItem = currentTarget; currentTarget = null; return; } if (grabbingItem != null && Input.GetMouseButtonUp(0)) { grabbingItem.LetGo(holdingPointVelocity); grabbingItem = null; } } Vector3 m_lastHoldingPointPos; public Vector3 holdingPointVelocity; void CalculateHoldingPointVelocity(){ holdingPointVelocity = holdingPoint.position - m_lastHoldingPointPos; m_lastHoldingPointPos = holdingPoint.position; } void ScanForTarget() { if (grabbingItem != null) { return; } RaycastHit hit = new RaycastHit(); Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0)); if (Physics.Raycast(ray, out hit, pickupDistance)) { scanningItem = hit.transform; Pickable pick = hit.transform.GetComponent(); if (pick != null) { currentTarget = pick.isGrabbing ? null : pick; Debug.DrawRay(transform.position, hit.point, Color.green); } else { currentTarget = null; Debug.DrawRay(transform.position, hit.point, Color.red); } } } }