void localMotion(EasyInputVR.Core.Motion motion) { if (laserPointer == null || !this.gameObject.activeInHierarchy) { return; } offsetPosition = motion.currentPos; offsetPosition.y += heightOffset; if (laserPointer.transform.parent == null) { laserPointer.transform.localPosition = initialPosition + offsetPosition; } else { laserPointer.transform.localPosition = offsetPosition; } laserPointer.transform.localRotation = motion.currentOrientation; if (motion.currentPos != Vector3.zero) { line.enabled = true; } else { line.enabled = false; return; } end = EasyInputConstants.NOT_VALID; //set the number of positions like we aren't going to hit anything #if UNITY_5_3 || UNITY_5_4 line.SetVertexCount(segmentsCount); #endif #if UNITY_5_5 line.numPositions = segmentsCount; #endif #if !(UNITY_5_3 || UNITY_5_4 || UNITY_5_5) line.positionCount = segmentsCount; #endif //origin line.SetPosition(0, laserPointer.transform.position); previous.transform.position = laserPointer.transform.position; previous.transform.forward = laserPointer.transform.forward; for (int i = 1; i < segmentsCount; i++) { //first set the position like it didn't hit anything line.SetPosition(i, (previous.transform.position + previous.transform.forward * segmentLength)); //now do the raycast if (colliderRaycast && Physics.Raycast(previous.transform.position, previous.transform.forward, out rayHit, segmentLength, layersToCheck)) { end = rayHit.point; line.SetPosition(i, end); //we hit something so adjust the number of positions #if UNITY_5_3 || UNITY_5_4 line.SetVertexCount(i + 1); #endif #if UNITY_5_5 line.numPositions = i + 1; #endif #if !(UNITY_5_3 || UNITY_5_4 || UNITY_5_5) line.positionCount = i + 1; #endif if (rayHit.transform != null && rayHit.transform.gameObject != null) { if (lastHitGameObject == null) { //we weren't hitting anything before and now we are EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, true, false); } else if (lastHitGameObject == rayHit.transform.gameObject) { //we are hitting the same object as last frame EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, false, false); } else if (lastHitGameObject != rayHit.transform.gameObject) { //we are hitting a different object than last frame EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, true, true); } lastHitGameObject = rayHit.transform.gameObject; lastRayHit = rayHit.point; } //break out of the loop since we hit something break; } previous.transform.position = previous.transform.position + previous.transform.forward * segmentLength; previous.transform.rotation = Quaternion.AngleAxis(segmentCurveDegrees, previous.transform.right) * previous.transform.rotation; } //hit something if (end != EasyInputConstants.NOT_VALID) { if (reticle != null) { reticle.SetActive(true); reticle.transform.position = end; reticle.transform.localScale = initialReticleSize * .6f * (Mathf.Sqrt((end - laserPointer.transform.position).magnitude / reticleDistance)); } } else { //didn't hit anything if (colliderRaycast) { //raycast enabled but didn't hit anything if (lastHitGameObject != null) { EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, false, false, true); lastHitGameObject = null; lastRayHit = EasyInputConstants.NOT_VALID; } } if (reticle != null) { reticle.SetActive(false); reticle.transform.position = previous.transform.position; reticle.transform.localScale = initialReticleSize; } } if (reticle != null) { reticle.GetComponent <MeshRenderer>().material.color = reticleColor; } //UI based interactions if (UIRaycast && InputModule != null && (motion.currentPos != Vector3.zero)) { InputModule.setUIRay(laserPointer.transform.position, laserPointer.transform.rotation, reticleDistance); uiHitPosition = InputModule.getuiHitPosition(); if (uiHitPosition != EasyInputConstants.NOT_VALID && (end == EasyInputConstants.NOT_VALID || (end - laserPointer.transform.position).magnitude > (uiHitPosition - laserPointer.transform.position).magnitude)) { reticle.SetActive(false); if ((uiHitPosition - laserPointer.transform.position).magnitude < reticleDistance) { reticle.transform.position = uiHitPosition; reticle.transform.localScale = initialReticleSize * .6f * (Mathf.Sqrt((uiHitPosition - laserPointer.transform.position).magnitude / reticleDistance)); } } } }
void localMotion(EasyInputVR.Core.Motion motion) { if (laserPointer == null || !this.gameObject.activeInHierarchy) { return; } if (reticle != null) { reticle.SetActive(true); } offsetPosition = motion.currentPos; offsetPosition.y += heightOffset; if (laserPointer.transform.parent == null) { laserPointer.transform.localPosition = initialPosition + offsetPosition; } else { laserPointer.transform.localPosition = offsetPosition; } laserPointer.transform.localRotation = motion.currentOrientation; if (motion.currentPos != Vector3.zero) { line.enabled = true; } else { //not valid so disable and don't bother with the raycast so return line.enabled = false; return; } end = EasyInputConstants.NOT_VALID; //origin line.SetPosition(0, laserPointer.transform.position); if (colliderRaycast && Physics.Raycast(laserPointer.transform.position, laserPointer.transform.forward, out rayHit, reticleDistance, layersToCheck)) { end = rayHit.point; if (rayHit.transform != null && rayHit.transform.gameObject != null) { if (lastHitGameObject == null) { //we weren't hitting anything before and now we are EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, true, false); } else if (lastHitGameObject == rayHit.transform.gameObject) { //we are hitting the same object as last frame EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, false, false); } else if (lastHitGameObject != rayHit.transform.gameObject) { //we are hitting a different object than last frame EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, true, true); } lastHitGameObject = rayHit.transform.gameObject; lastRayHit = rayHit.point; } } //endpoint //line.SetPosition(1, end); if (end != EasyInputConstants.NOT_VALID) { if (reticle != null) { reticle.transform.position = end; reticle.transform.localScale = initialReticleSize * .6f * (Mathf.Sqrt((end - laserPointer.transform.position).magnitude / reticleDistance)); } if ((end - laserPointer.transform.position).magnitude < laserDistance) { line.SetPosition(1, end); } else { line.SetPosition(1, laserPointer.transform.position + laserPointer.transform.forward * laserDistance); } } else { //didn't hit anything if (colliderRaycast) { //raycast enabled but didn't hit anything if (lastHitGameObject != null) { EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, false, false, true); lastHitGameObject = null; lastRayHit = EasyInputConstants.NOT_VALID; } } if (reticle != null) { reticle.transform.position = laserPointer.transform.position + laserPointer.transform.forward * reticleDistance; reticle.transform.localScale = initialReticleSize; } line.SetPosition(1, laserPointer.transform.position + laserPointer.transform.forward * laserDistance); } if (reticle != null) { reticle.GetComponent <MeshRenderer>().material.color = reticleColor; } //UI based interactions if (UIRaycast && InputModule != null && (motion.currentPos != Vector3.zero)) { InputModule.setUIRay(laserPointer.transform.position, laserPointer.transform.rotation, reticleDistance); uiHitPosition = InputModule.getuiHitPosition(); if (uiHitPosition != EasyInputConstants.NOT_VALID && (end == EasyInputConstants.NOT_VALID || (end - laserPointer.transform.position).magnitude > (uiHitPosition - laserPointer.transform.position).magnitude)) { if ((uiHitPosition - laserPointer.transform.position).magnitude < reticleDistance) { reticle.transform.position = uiHitPosition; reticle.transform.localScale = initialReticleSize * .6f * (Mathf.Sqrt((uiHitPosition - laserPointer.transform.position).magnitude / reticleDistance)); } } } }
void Update() { if (reticle != null) { reticle.SetActive(true); } end = EasyInputConstants.NOT_VALID; if (colliderRaycast && Physics.Raycast(hmd.transform.position, hmd.transform.forward, out rayHit, reticleDistance, layersToCheck)) { end = rayHit.point; if (rayHit.transform != null && rayHit.transform.gameObject != null) { if (lastHitGameObject == null) { //we weren't hitting anything before and now we are EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, true, false); } else if (lastHitGameObject == rayHit.transform.gameObject) { //we are hitting the same object as last frame EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, false, false); } else if (lastHitGameObject != rayHit.transform.gameObject) { //we are hitting a different object than last frame EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, true, true, true); } lastHitGameObject = rayHit.transform.gameObject; lastRayHit = rayHit.point; } } if (end != EasyInputConstants.NOT_VALID) { if (reticle != null) { reticle.transform.position = end; reticle.transform.localScale = initialReticleSize * .6f * (Mathf.Sqrt((end - hmd.transform.position).magnitude / reticleDistance)); } } else { //didn't hit anything if (colliderRaycast) { //raycast enabled but didn't hit anything if (lastHitGameObject != null) { EasyInputUtilities.notifyEvents(rayHit, lastRayHit, lastHitGameObject, false, false, true); lastHitGameObject = null; lastRayHit = EasyInputConstants.NOT_VALID; } } if (reticle != null) { reticle.transform.position = hmd.transform.position + hmd.transform.forward * reticleDistance; reticle.transform.localScale = initialReticleSize; } } if (reticle != null) { reticle.GetComponent <MeshRenderer>().material.color = reticleColor; } //UI based interactions if (UIRaycast && InputModule != null) { InputModule.setUIRay(hmd.transform.position, hmd.transform.rotation, reticleDistance); uiHitPosition = InputModule.getuiHitPosition(); if (uiHitPosition != EasyInputConstants.NOT_VALID && (end == EasyInputConstants.NOT_VALID || (end - hmd.transform.position).magnitude > (uiHitPosition - hmd.transform.position).magnitude)) { if ((uiHitPosition - hmd.transform.position).magnitude < reticleDistance) { reticle.transform.position = uiHitPosition; reticle.transform.localScale = initialReticleSize * .6f * (Mathf.Sqrt((uiHitPosition - hmd.transform.position).magnitude / reticleDistance)); } } } }