myGaze/Assets/myScripts/EyeTrackingRay.cs
2025-11-03 22:28:23 +01:00

144 lines
4.5 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(LineRenderer))]
public class EyeTrackingRay : MonoBehaviour
{
public static EyeTrackingRay Instance;
[SerializeField]
private float rayDinstance = 1.0f;
[SerializeField]
private float rayWidth = 0.01f;
[SerializeField]
private LayerMask layersToInclude;
[SerializeField]
private Color rayColorDefaultState = Color.yellow;
[SerializeField]
private Color rayColorHoverState = Color.red;
private LineRenderer lineRenderer;
private List<EyeInteractable> eyeInteractables = new List<EyeInteractable>();
private List<EyeInteractableUnlock> eyeInteractableUnlocks = new List<EyeInteractableUnlock>();
private List<EyeButtonSceneLoader> buttonLoaders = new List<EyeButtonSceneLoader>();
private List<EyeInteractableDwellLight> dwellLights = new List<EyeInteractableDwellLight>(); // NEW
void Awake()
{
Instance = this;
}
void Start()
{
lineRenderer = GetComponent<LineRenderer>();
SetupRay();
}
void SetupRay()
{
lineRenderer.useWorldSpace = false;
lineRenderer.positionCount = 2;
lineRenderer.startWidth = rayWidth;
lineRenderer.endWidth = rayWidth;
lineRenderer.startColor = rayColorDefaultState;
lineRenderer.endColor = rayColorDefaultState;
lineRenderer.SetPosition(0, Vector3.zero);
lineRenderer.SetPosition(1, Vector3.forward * rayDinstance);
}
void FixedUpdate()
{
RaycastHit hit;
Vector3 rayCastDirection = transform.TransformDirection(Vector3.forward);
if (Physics.Raycast(transform.position, rayCastDirection, out hit, rayDinstance, layersToInclude))
{
// Check for EyeInteractable
var eyeInteractable = hit.transform.GetComponent<EyeInteractable>();
if (eyeInteractable != null && !eyeInteractables.Contains(eyeInteractable))
{
eyeInteractables.Add(eyeInteractable);
eyeInteractable.OnStartLooking();
}
// Check for EyeInteractableUnlock
var eyeInteractableUnlock = hit.transform.GetComponent<EyeInteractableUnlock>();
if (eyeInteractableUnlock != null && !eyeInteractableUnlocks.Contains(eyeInteractableUnlock))
{
eyeInteractableUnlocks.Add(eyeInteractableUnlock);
eyeInteractableUnlock.OnStartLooking();
}
// Check for EyeButtonSceneLoader
var buttonLoader = hit.transform.GetComponent<EyeButtonSceneLoader>();
if (buttonLoader != null && !buttonLoaders.Contains(buttonLoader))
{
buttonLoaders.Add(buttonLoader);
buttonLoader.OnStartLooking();
}
// Check for EyeInteractableDwellLight (NEW)
var dwellLight = hit.transform.GetComponent<EyeInteractableDwellLight>();
if (dwellLight != null && !dwellLights.Contains(dwellLight))
{
dwellLights.Add(dwellLight);
dwellLight.OnStartLooking();
}
lineRenderer.startColor = rayColorHoverState;
lineRenderer.endColor = rayColorHoverState;
}
else
{
lineRenderer.startColor = rayColorDefaultState;
lineRenderer.endColor = rayColorDefaultState;
UnSelect(true);
}
}
void UnSelect(bool clear = false)
{
foreach (var interactable in eyeInteractables)
{
if (interactable != null)
{
interactable.OnStopLooking();
}
}
// UnSelect EyeInteractableUnlock objects
foreach (var interactableUnlock in eyeInteractableUnlocks)
{
if (interactableUnlock != null)
{
interactableUnlock.OnStopLooking();
}
}
foreach (var buttonLoader in buttonLoaders)
{
if (buttonLoader != null)
{
buttonLoader.OnStopLooking();
}
}
// UnSelect EyeInteractableDwellLight objects (NEW)
foreach (var dwellLight in dwellLights)
{
if (dwellLight != null)
{
dwellLight.OnStopLooking();
}
}
if (clear)
{
eyeInteractables.Clear();
eyeInteractableUnlocks.Clear();
buttonLoaders.Clear();
dwellLights.Clear(); // NEW
}
}
}