/// <summary> /// Handles possible interactions when the subscribed cursor is within a target. /// This includes contingencies like the gazeTarget being null, subscribing to the functions that wait /// for a nod or dwell time and calling the DeselectHoveredObject to handle unsubscribing. /// </summary> /// <param name="gazeTarget"></param> private void HandleTrackedObject(EyeGazeTarget gazeTarget) { if (gazeTarget == null) { DeselectHoveredObject(); return; } if (!gazeTarget.IsDisabled) { if (gazeTarget != _currentHoveredTarget) { if (_currentHoveredTarget != null) { DeselectHoveredObject(); } _currentHoveredTarget = gazeTarget; switch (CurrentConfirmationMethod) { case TestBlock.ConfirmationMethod.Dwell: _currentHoveredTarget.OnDwell += WaitForDwell; break; case TestBlock.ConfirmationMethod.HeadGesture: HasNodded += OnNod; _waitingForGesture = true; break; } } gazeTarget.OnEyeIn(); } }
private EyeGazeTarget SpawnTarget(int sequenceIndex, int stepNumber, bool activeTarget) { float angle = TestBlockData.Sequences[sequenceIndex].Trials[stepNumber].TargetAngle; float amplitude = TestBlockData.Sequences[sequenceIndex].TargetAmplitude; float size = TestBlockData.Sequences[sequenceIndex].TargetWidth; Vector2 spawnPosition = GetTargetSpawnPosition(amplitude, angle); GameObject target = Instantiate(activeTarget ? _eyeGazeTargetPrefab : _eyeGazeInactiveTargetPrefab, Vector3.zero, Quaternion.identity); target.transform.SetParent(_targetCanvas.transform, false); if (activeTarget) { target.transform.SetAsFirstSibling(); } EyeGazeTarget eyeGazeTarget = target.GetComponent <EyeGazeTarget>(); eyeGazeTarget.SetSize(size); eyeGazeTarget.SetPosition(spawnPosition.x, spawnPosition.y); CurrentTarget = target.GetComponent <EyeGazeTarget>(); CurrentTarget.OnFixate += TargetFixated; CurrentTarget.OnActivated += TargetActivated; CurrentTarget.OnReleased += TargetReleased; eyeGazeTarget.transform.SetAsLastSibling(); return(eyeGazeTarget); }
/// <summary> /// If the other object has an EyeGazeTarget component, /// signal the subscriber to the appropriate event in VREyeTrackercontroller.cs. /// </summary> /// <param name="other"> The collider of the other object.</param> void OnTriggerEnter(Collider other) { EyeGazeTarget target = other.transform.parent.GetComponent <EyeGazeTarget>(); if (target == null) { return; } if (_trackedTarget != null) { if (_trackedTarget == target) { return; } if (TargetUnhovered != null) { TargetUnhovered(_trackedTarget); } } _trackedTarget = target; if (TargetHovered != null) { TargetHovered(target); } }
/// <summary> /// If the other object has an EyeGazeTarget component, signal the TargetStayed event's subscriber. /// </summary> /// <param name="other"> The collider of the other object.</param> void OnTriggerStay(Collider other) { EyeGazeTarget target = other.transform.parent.GetComponent <EyeGazeTarget>(); if (target != null) { if (TargetStayed != null) { TargetStayed(target); } } }
/// <summary> /// If the other object has an EyeGazeTarget component, signal the TargetUnhovered event's subscriber. /// </summary> /// <param name="other"> The collider of the other object.</param> void OnTriggerExit(Collider other) { EyeGazeTarget target = other.transform.parent.GetComponent <EyeGazeTarget>(); if (target != null) { if (TargetUnhovered != null) { TargetUnhovered(target); } } _trackedTarget = null; }
/// <summary> /// Handles unsubscribing when cursor leaves target. /// </summary> private void DeselectHoveredObject() { if (_currentHoveredTarget == null) { return; } switch (CurrentConfirmationMethod) { case TestBlock.ConfirmationMethod.Dwell: _currentHoveredTarget.OnDwell -= WaitForDwell; break; case TestBlock.ConfirmationMethod.HeadGesture: HasNodded -= OnNod; break; } _currentHoveredTarget.OnEyeOut(); _currentHoveredTarget = null; }
private void OnCursorUnhover(EyeGazeTarget target) { HandleTrackedObject(null); }
private void OnCursorStay(EyeGazeTarget target) { HandleTrackedObject(target); }
private void OnCursorHover(EyeGazeTarget target) { OnCursorStay(target); }