/**************************************************************************** * Copyright 2019 Nreal Techonology Limited. All rights reserved. * * This file is part of NRSDK. * * https://www.nreal.ai/ * *****************************************************************************/ namespace NRKernal { using UnityEngine; /// A nr laser reticle. public class NRLaserReticle : MonoBehaviour { /// Values that represent reticle states. public enum ReticleState { /// An enum constant representing the hide option. Hide, /// An enum constant representing the normal option. Normal, /// An enum constant representing the hover option. Hover, } /// The raycaster. [SerializeField] private NRPointerRaycaster m_Raycaster; /// The default visual. [SerializeField] private GameObject m_DefaultVisual; /// The hover visual. [SerializeField] private GameObject m_HoverVisual; /// The hit target. private GameObject m_HitTarget; /// True if is visible, false if not. private bool m_IsVisible = true; /// The default distance. public float defaultDistance = 2.5f; /// The reticle size ratio. public float reticleSizeRatio = 0.02f; /// Gets the camera root. /// The m camera root. private Transform m_CameraRoot { get { return NRInput.CameraCenter; } } /// Gets the hit target. /// The hit target. public GameObject HitTarget { get { return m_HitTarget; } } /// Awakes this object. private void Awake() { SwitchReticleState(ReticleState.Hide); defaultDistance = Mathf.Clamp(defaultDistance, m_Raycaster.NearDistance, m_Raycaster.FarDistance); } /// Late update. protected virtual void LateUpdate() { if (!m_IsVisible || !NRInput.ReticleVisualActive) { SwitchReticleState(ReticleState.Hide); return; } var result = m_Raycaster.FirstRaycastResult(); var points = m_Raycaster.BreakPoints; var pointCount = points.Count; if (result.isValid) { SwitchReticleState(ReticleState.Hover); transform.position = result.worldPosition; transform.rotation = Quaternion.LookRotation(result.worldNormal, m_Raycaster.transform.forward); m_HitTarget = result.gameObject; } else { SwitchReticleState(ReticleState.Normal); if (pointCount != 0) { transform.localPosition = Vector3.forward * defaultDistance; transform.localRotation = Quaternion.identity; } m_HitTarget = null; } if (m_CameraRoot) transform.localScale = Vector3.one * reticleSizeRatio * (transform.position - m_CameraRoot.transform.position).magnitude; } /// Executes the 'disable' action. private void OnDisable() { SwitchReticleState(ReticleState.Hide); } /// Switch reticle state. /// The state. private void SwitchReticleState(ReticleState state) { switch (state) { case ReticleState.Hide: m_DefaultVisual.SetActive(false); m_HoverVisual.SetActive(false); break; case ReticleState.Normal: m_DefaultVisual.SetActive(true); m_HoverVisual.SetActive(false); break; case ReticleState.Hover: m_DefaultVisual.SetActive(false); m_HoverVisual.SetActive(true); break; default: break; } } /// Sets a visible. /// True if is visible, false if not. public void SetVisible(bool isVisible) { this.m_IsVisible = isVisible; } } }