using System; using System.Collections; using UnityEngine; using UnityEngine.InputSystem; public class GazeInteractable : MonoBehaviour { [Header("References")] public Camera head; public Transform snapPoint; public InputActionReference rightTrigger; [Header("Materials")] public Material defaultMaterial; public Material hoverMaterial; [Header("Settings")] public LayerMask snapLayer; public LayerMask cubeLayer; public float snapDistance = 0.5f; public float lerpSpeed = 10.0f; private bool grabbed = false; private bool hovered = false; private float grabDistance = 0.0f; private Renderer cubeRenderer; void Awake() { cubeRenderer = GetComponentInChildren(); } void Update() { CheckHovered(); Grab(); Snap(); cubeRenderer.material = hovered ? hoverMaterial : defaultMaterial; } private void CheckHovered() { hovered = Physics.Raycast(head.transform.position, head.transform.forward, out RaycastHit hit, cubeLayer); } private void Grab() { bool pressed = rightTrigger.action.ReadValue() > 0.5f; if (pressed && !grabbed && hovered) { grabDistance = Vector3.Distance(head.transform.position, transform.position); grabbed = true; } else if (!pressed && grabbed) { grabbed = false; FindNearestSnapPoint(); } if (grabbed) { transform.position = head.transform.position + head.transform.forward * grabDistance; } } private void Snap() { if (!grabbed && snapPoint != null) { transform.position = Vector3.Lerp(transform.position, snapPoint.position, lerpSpeed * Time.deltaTime); transform.rotation = Quaternion.Lerp(transform.rotation, snapPoint.rotation, lerpSpeed * Time.deltaTime); } } private void FindNearestSnapPoint() { Collider[] snapPoints = Physics.OverlapSphere(transform.position, snapDistance, snapLayer); if (snapPoints.Length > 0) { Transform nearest = null; float min = float.MaxValue; foreach (var point in snapPoints) { float distance = Vector3.Distance(transform.position, point.transform.position); if (distance < min) { min = distance; nearest = point.transform; } } if (nearest != null) { snapPoint = nearest; } } } private void OnDrawGizmosSelected() { Gizmos.color = Color.green; Gizmos.DrawWireSphere(transform.position, snapDistance); } }