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 eyeInteractables = new List(); private List eyeInteractableUnlocks = new List(); private List buttonLoaders = new List(); private List dwellLights = new List(); // NEW void Awake() { Instance = this; } void Start() { lineRenderer = GetComponent(); 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(); if (eyeInteractable != null && !eyeInteractables.Contains(eyeInteractable)) { eyeInteractables.Add(eyeInteractable); eyeInteractable.OnStartLooking(); } // Check for EyeInteractableUnlock var eyeInteractableUnlock = hit.transform.GetComponent(); if (eyeInteractableUnlock != null && !eyeInteractableUnlocks.Contains(eyeInteractableUnlock)) { eyeInteractableUnlocks.Add(eyeInteractableUnlock); eyeInteractableUnlock.OnStartLooking(); } // Check for EyeButtonSceneLoader var buttonLoader = hit.transform.GetComponent(); if (buttonLoader != null && !buttonLoaders.Contains(buttonLoader)) { buttonLoaders.Add(buttonLoader); buttonLoader.OnStartLooking(); } // Check for EyeInteractableDwellLight (NEW) var dwellLight = hit.transform.GetComponent(); 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 } } }