// Update is called once per frame
    protected virtual void Update()
    {
        RaycastHit hit;
        Ray        gazeRay   = new Ray(transform.position, transform.forward);
        bool       hasRayHit = Physics.Raycast(gazeRay, out hit, maxLength, ~layersToIgnore);

        GazeMarkerEventArgs eventArgs = new GazeMarkerEventArgs();

        if (hasRayHit && hit.distance < maxLength)
        {
            marker.transform.localPosition = new Vector3(0f, 0f, hit.distance - (marker.transform.localScale.z / 2));

            eventArgs.gazeTarget    = hit.transform.gameObject;
            eventArgs.gazeTransform = hit.transform;
            eventArgs.distance      = hit.distance;
        }
        else
        {
            marker.transform.localPosition = new Vector3(0f, 0f, hit.distance - (marker.transform.localScale.z / 2));
            eventArgs.distance             = maxLength;
        }

        eventArgs.position = marker.transform.position;

        GazeMarkerSet(this, eventArgs);
    }
 //------------------------------------------------------------------------------------------------------------------
 // Event Handlers
 //------------------------------------------------------------------------------------------------------------------
 protected virtual void DoGazeMarkerSet(object sender, GazeMarkerEventArgs e)
 {
     gazeDestination = e.position;
     gazeTarget      = e.gazeTarget;
 }