summaryrefslogtreecommitdiff
path: root/Assets/Scripts
diff options
context:
space:
mode:
authorpryazha <pryadeiniv@mail.ru>2025-07-02 08:46:23 -0700
committerpryazha <pryadeiniv@mail.ru>2025-07-02 08:46:23 -0700
commit8263edd59284aba390aca011d25b79efecef4c48 (patch)
tree6346e2afaaabd32156601cafaf20d4ee813befaf /Assets/Scripts
Diffstat (limited to 'Assets/Scripts')
-rw-r--r--Assets/Scripts/GazeInteractable.cs95
-rw-r--r--Assets/Scripts/GazeInteractable.cs.meta2
2 files changed, 97 insertions, 0 deletions
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<Renderer>();
+ }
+
+ 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<float>() > 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