From 8263edd59284aba390aca011d25b79efecef4c48 Mon Sep 17 00:00:00 2001 From: pryazha Date: Wed, 2 Jul 2025 08:46:23 -0700 Subject: init --- Assets/Scripts/GazeInteractable.cs | 95 +++++++++++++++++++++++++++++++++ Assets/Scripts/GazeInteractable.cs.meta | 2 + 2 files changed, 97 insertions(+) create mode 100644 Assets/Scripts/GazeInteractable.cs create mode 100644 Assets/Scripts/GazeInteractable.cs.meta (limited to 'Assets/Scripts') diff --git a/Assets/Scripts/GazeInteractable.cs b/Assets/Scripts/GazeInteractable.cs new file mode 100644 index 0000000..52b6744 --- /dev/null +++ b/Assets/Scripts/GazeInteractable.cs @@ -0,0 +1,95 @@ +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); + } +} diff --git a/Assets/Scripts/GazeInteractable.cs.meta b/Assets/Scripts/GazeInteractable.cs.meta new file mode 100644 index 0000000..96de461 --- /dev/null +++ b/Assets/Scripts/GazeInteractable.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5f7fff1a3708d1b498b1af7f098ef11e \ No newline at end of file -- cgit v1.2.3-70-g09d2