diff options
author | pryazha <pryadeiniv@mail.ru> | 2025-07-02 08:46:23 -0700 |
---|---|---|
committer | pryazha <pryadeiniv@mail.ru> | 2025-07-02 08:46:23 -0700 |
commit | 8263edd59284aba390aca011d25b79efecef4c48 (patch) | |
tree | 6346e2afaaabd32156601cafaf20d4ee813befaf /Assets/Scripts/GazeInteractable.cs |
Diffstat (limited to 'Assets/Scripts/GazeInteractable.cs')
-rw-r--r-- | Assets/Scripts/GazeInteractable.cs | 95 |
1 files changed, 95 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);
+ }
+}
|