144 lines
4.5 KiB
C#
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
|
|
}
|
|
}
|
|
} |