private void OnTriggerExit(Collider other) { //********************************************************************************************************************************************************************************************************** // https://blogs.unity3d.com/2014/05/16/custom-operator-should-we-keep-it/ // The c++ object becomes null but part of the c# unity wrapper hangs on so this check is actually important even though it seems insane // the link above explains it. if (isTouchingVrButton != null && isTouchingVrButton.Equals(null)) { isTouchingVrButton = null; } // ********************************************************************************************************************************************************************************************************* if (isTouchingVrButton != null && ((MonoBehaviour)isTouchingVrButton).gameObject.Equals(other.gameObject)) { isTouchingVrButton.PointerExit(transform.position); isTouchingVrButton = null; } }
// Update is called once per frame private void Update() { transform.localPosition = UnityEngine.XR.InputTracking.GetLocalPosition(vrNode); transform.localRotation = UnityEngine.XR.InputTracking.GetLocalRotation(vrNode); if (useLaserPointer) { laserPointerRenderer.SetPosition(0, transform.position); RaycastHit hit; if (Physics.Raycast(new Ray(transform.position, transform.forward), out hit)) { laserPointerRenderer.SetPosition(1, hit.point); IPointerHandlerVr ipvr = hit.collider.gameObject.GetComponent <IPointerHandlerVr>(); if (ipvr != null) { if (isTouchingVrButton != null && isTouchingVrButton != ipvr) { isTouchingVrButton.PointerExit(transform.position); isTouchingVrButton = null; } isTouchingVrButton = ipvr; isTouchingVrButton.PointerEnter(transform.position); } else { if (isTouchingVrButton != null) { isTouchingVrButton.PointerExit(transform.position); isTouchingVrButton = null; } } } else { if (isTouchingVrButton != null) { isTouchingVrButton.PointerExit(transform.position); isTouchingVrButton = null; } laserPointerRenderer.SetPosition(1, transform.position + transform.forward * 5f); } } if (Input.GetButtonDown("VRSubmit") && isTouchingVrButton != null) { isTouchingVrButton.PointerDown(transform.position); } if (Input.GetButtonUp("VRSubmit") && isTouchingVrButton != null) { isTouchingVrButton.PointerUp(transform.position); } //rotate the globe with the touchpad globeTransform.Rotate(Vector3.up, globeRotSpeed * Input.GetAxis("Horizontal") * Time.deltaTime, Space.World); if (!Input.GetButton("VRSubmit") && isZoom) { isZoom = false; } if (isZoom) { float newDist = Vector3.Distance(transform.position, globeTransform.position); if (newDist - oldDist > scaleThreshold && globeTransform.localScale.x < 2.75f || oldDist - newDist > scaleThreshold && globeTransform.localScale.x > 0.25f) { globeTransform.localScale += Vector3.one * scaleSpeed * (newDist - oldDist) * Time.deltaTime; oldDist = newDist; } } if (Input.GetButton("VRSubmit") && !isZoom) { isZoom = true; oldDist = Vector3.Distance(transform.position, globeTransform.position); } }