示例#1
0
        void localAxis(ControllerAxis axis)
        {
            horizontal    = axis.axisValue.x * sensitivity * Time.deltaTime * 100f;
            vertical      = axis.axisValue.y * sensitivity * Time.deltaTime * 100f;
            actionVector3 = EasyInputUtilities.getControllerVector3(horizontal, vertical, axisHorizontal, axisVertical);

            switch (action)
            {
            case EasyInputConstants.ACTION_TYPE.Position:
                transform.position += actionVector3;
                break;

            case EasyInputConstants.ACTION_TYPE.Rotation:
                transform.Rotate(actionVector3, Space.World);
                break;

            case EasyInputConstants.ACTION_TYPE.LocalPosition:
                transform.Translate(actionVector3);
                break;

            case EasyInputConstants.ACTION_TYPE.LocalRotation:
                transform.Rotate(actionVector3);
                break;

            case EasyInputConstants.ACTION_TYPE.LocalScale:
                transform.localScale += actionVector3;
                break;

            default:
                Debug.Log("Invalid Action");
                break;
            }
        }
示例#2
0
        void localAxis(InputTouch touch)
        {
            if (dpadMode == EasyInputConstants.DPAD_MODE.RegisterAlways || isClicking == false)
            {
                //check to see if we've exceeded the deadzone
                if (Mathf.Sqrt(Mathf.Pow(touch.currentTouchPosition.x, 2) + Mathf.Pow(touch.currentTouchPosition.y, 2)) > deadZone)
                {
                    horizontal = touch.currentTouchPosition.x * sensitivity * Time.deltaTime * 10f;
                    vertical   = touch.currentTouchPosition.y * sensitivity * Time.deltaTime * 10f;
                }
                else
                {
                    horizontal = 0f;
                    vertical   = 0f;
                }

                actionVector3 = EasyInputUtilities.getControllerVector3(horizontal, vertical, EasyInputConstants.AXIS.XAxis, EasyInputConstants.AXIS.ZAxis);

                previousPos = transform.position;

                transform.Translate(actionVector3, lookObject.transform);

                //we want the x and z from the translate but not the y if we are looking up/down
                previousPos.x = transform.position.x;
                previousPos.z = transform.position.z;

                transform.position = previousPos;
            }
        }
        void localAxis(InputTouch touch)
        {
            if (blockInput)
            {
                return;
            }

            if (dpadMode == EasyInputConstants.DPAD_MODE.RegisterAlways || isClicking == false)
            {
                //check to see if we've exceeded the deadzone
                if (Mathf.Sqrt(Mathf.Pow(touch.currentTouchPosition.x, 2) + Mathf.Pow(touch.currentTouchPosition.y, 2)) > deadZone)
                {
                    horizontal = touch.currentTouchPosition.x * sensitivity * Time.deltaTime * 10f;
                    vertical   = touch.currentTouchPosition.y * sensitivity * Time.deltaTime * 10f;
                }
                else
                {
                    horizontal = 0f;
                    vertical   = 0f;
                }

                actionVector3 = EasyInputUtilities.getControllerVector3(horizontal, vertical, axisHorizontal, axisVertical);

                switch (action)
                {
                case EasyInputConstants.ACTION_TYPE.Position:
                    transform.position += actionVector3;
                    break;

                case EasyInputConstants.ACTION_TYPE.Rotation:
                    transform.Rotate(actionVector3, Space.World);
                    break;

                case EasyInputConstants.ACTION_TYPE.LocalPosition:
                    transform.Translate(actionVector3);
                    break;

                case EasyInputConstants.ACTION_TYPE.LocalRotation:
                    transform.Rotate(actionVector3);
                    break;

                case EasyInputConstants.ACTION_TYPE.LocalScale:
                    transform.localScale += actionVector3;
                    break;

                default:
                    Debug.Log("Invalid Action");
                    break;
                }
            }
        }
示例#4
0
        void localAxis(InputTouch touch)
        {
            //first check to see if this is the first frame
            if (lastFrameTouch == EasyInputConstants.NOT_TOUCHING)
            {
                lastFrameTouch = touch.currentTouchPosition;
                return;
            }

            if (blockInput)
            {
                return;
            }

            //otherwise is a continuation
            horizontal    = (touch.currentTouchPosition.x - lastFrameTouch.x) * sensitivity * Time.deltaTime * 100f;
            vertical      = (touch.currentTouchPosition.y - lastFrameTouch.y) * sensitivity * Time.deltaTime * 100f;
            actionVector3 = EasyInputUtilities.getControllerVector3(horizontal, vertical, axisHorizontal, axisVertical);

            switch (action)
            {
            case EasyInputConstants.ACTION_TYPE.Position:
                transform.position += actionVector3;
                break;

            case EasyInputConstants.ACTION_TYPE.Rotation:
                transform.Rotate(actionVector3, Space.World);
                break;

            case EasyInputConstants.ACTION_TYPE.LocalPosition:
                transform.Translate(actionVector3);
                break;

            case EasyInputConstants.ACTION_TYPE.LocalRotation:
                transform.Rotate(actionVector3);
                break;

            case EasyInputConstants.ACTION_TYPE.LocalScale:
                transform.localScale += actionVector3;
                break;

            default:
                Debug.Log("Invalid Action");
                break;
            }

            lastFrameTouch = touch.currentTouchPosition;
        }
        void localGyro(Vector3 gravity, Vector3 userAccel)
        {
            //save the last rotation
            if (didRealUpdateLastFrame)
            {
                didRealUpdateLastFrame = false;
                lastRotation           = myRotation.x;
            }


            //because we are only modifying one component I don't need to copy into a local variable
            myRotation.x = EasyInputUtilities.relativeAngleInAxis(Vector3.up, -gravity, Vector3.right);

            myRotation.x *= -sensitivity;

            //we need to adjust for if the z is parallel with gravity (x undefined)
            if (gravity.z > .97 || gravity.z < -.97)
            {
                //all the way forward or back
                myRotation.x = lastRotation;
            }

            //clamp the up/down rotation if set this way
            if (clampRotation && clampRotationDegreesFromZero != 0f)
            {
                if (myRotation.x <= (360f - clampRotationDegreesFromZero) && myRotation.x >= clampRotationDegreesFromZero)
                {
                    if (myRotation.x <= 180f)
                    {
                        myRotation.x = clampRotationDegreesFromZero;
                    }
                    else if (myRotation.x > 180f)
                    {
                        myRotation.x = (360f - clampRotationDegreesFromZero);
                    }
                }
            }

            //at this point we'd have the correct result but it would be very shaky
            //lerp or slerp doesn't seem to be good enough so manually make it smooth
            if ((lastRotation - myRotation.x) > precision || (lastRotation - myRotation.x) < -precision)
            {
                //only moving in increments of tilt precesion degrees
                didRealUpdateLastFrame  = true;
                transform.localRotation = Quaternion.Euler(myRotation);
            }
        }
示例#6
0
        void localMotion(EasyInputVR.Core.Motion motion)
        {
            //accelerometers due to gravity can really only sense 2 axis (can't filter out gravity)
            //here we convert those 2 axis into horizontal and vertical and normalize

            horizontal = motion.currentOrientationEuler.z;
            vertical   = motion.currentOrientationEuler.x;

            //get into a -180 to 180 range
            horizontal = (horizontal > 180f) ? (horizontal - 360f) : horizontal;
            vertical   = (vertical > 180f) ? (vertical - 360f) : vertical;

            horizontal = horizontal / normalizeDegrees;
            vertical   = vertical / normalizeDegrees;

            horizontal *= -sensitivity * Time.deltaTime * 100f;
            vertical   *= -sensitivity * Time.deltaTime * 100f;

            actionVector3 = EasyInputUtilities.getControllerVector3(horizontal, vertical, tiltHorizontal, tiltVertical);

            switch (action)
            {
            case EasyInputConstants.ACTION_TYPE.Position:
                transform.position += actionVector3;
                break;

            case EasyInputConstants.ACTION_TYPE.Rotation:
                transform.Rotate(actionVector3, Space.World);
                break;

            case EasyInputConstants.ACTION_TYPE.LocalPosition:
                transform.Translate(actionVector3);
                break;

            case EasyInputConstants.ACTION_TYPE.LocalRotation:
                transform.Rotate(actionVector3);
                break;

            case EasyInputConstants.ACTION_TYPE.LocalScale:
                transform.localScale += actionVector3;
                break;

            default:
                Debug.Log("Invalid Action");
                break;
            }
        }
        void localAccelerometer(Vector3 accel)
        {
            //accelerometers due to gravity can really only sense 2 axis (can't filter out gravity)
            //here we convert those 2 axis into horizontal and vertical and normalize
            horizontal = EasyInputUtilities.relativeAngleInAxis(Vector3.up, -accel, Vector3.forward) / normalizeDegrees;
            vertical   = EasyInputUtilities.relativeAngleInAxis(Vector3.up, -accel, Vector3.right) / normalizeDegrees;

            horizontal *= -sensitivity * Time.deltaTime * 100f;
            vertical   *= -sensitivity * Time.deltaTime * 100f;

            actionVector3 = EasyInputUtilities.getControllerVector3(horizontal, vertical, tiltHorizontal, tiltVertical);

            switch (action)
            {
            case EasyInputConstants.ACTION_TYPE.Position:
                transform.position += actionVector3;
                break;

            case EasyInputConstants.ACTION_TYPE.Rotation:
                transform.Rotate(actionVector3, Space.World);
                break;

            case EasyInputConstants.ACTION_TYPE.LocalPosition:
                transform.Translate(actionVector3);
                break;

            case EasyInputConstants.ACTION_TYPE.LocalRotation:
                transform.Rotate(actionVector3);
                break;

            case EasyInputConstants.ACTION_TYPE.LocalScale:
                transform.localScale += actionVector3;
                break;

            default:
                Debug.Log("Invalid Action");
                break;
            }
        }
示例#8
0
        void localGyro(Vector3 gravity, Vector3 userAcceleration)
        {
            //save the last rotation
            if (didRealUpdateLastFrame)
            {
                didRealUpdateLastFrame = false;
                lastRotation           = myRotation.y;
            }

            //reset the rotation
            myRotation.y = 0f;

#if !UNITY_EDITOR && UNITY_TVOS
            //because we are only modifying one component I don't need to copy into a local variable
            myRotation.y = EasyInputUtilities.relativeAngleInAxis(Vector3.up, -gravity, Vector3.forward);

            myRotation.y *= -tiltSensitivity;

            //we need to adjust for if the z is parallel with gravity ( y undefined)
            if (gravity.x > .97 || gravity.x < -.97)
            {
                //all the way forward or back
                myRotation.y = lastRotation;
            }
#endif

            myRotation.y += accumulatedRotation;

            //at this point we'd have the correct result but it would be very shaky
            //lerp or slerp doesn't seem to be good enough so manually make it smooth
            if ((lastRotation - myRotation.y) > tiltPrecision || (lastRotation - myRotation.y) < -tiltPrecision)
            {
                //only moving in increments of tilt precesion degrees
                didRealUpdateLastFrame         = true;
                player.transform.localRotation = Quaternion.Euler(myRotation);
            }
        }
示例#9
0
        void localAxis(ControllerAxis axis)
        {
            //first thing check if it's the right player otherwise do nothing
            if (axis.player == player || player == EasyInputConstants.PLAYER_NUMBER.Any)
            {
                horizontal    = axis.axisValue.x * sensitivity * Time.deltaTime * 100f;
                vertical      = axis.axisValue.y * sensitivity * Time.deltaTime * 100f;
                actionVector3 = EasyInputUtilities.getControllerVector3(horizontal, vertical, axisHorizontal, axisVertical);

                switch (action)
                {
                case EasyInputConstants.ACTION_TYPE.Position:
                    transform.position += actionVector3;
                    break;

                case EasyInputConstants.ACTION_TYPE.Rotation:
                    transform.Rotate(actionVector3, Space.World);
                    break;

                case EasyInputConstants.ACTION_TYPE.LocalPosition:
                    transform.Translate(actionVector3);
                    break;

                case EasyInputConstants.ACTION_TYPE.LocalRotation:
                    transform.Rotate(actionVector3);
                    break;

                case EasyInputConstants.ACTION_TYPE.LocalScale:
                    transform.localScale += actionVector3;
                    break;

                default:
                    Debug.Log("Invalid Action");
                    break;
                }
            }
        }
示例#10
0
        public void steerBall(Vector3 accel)
        {
            //accelerometers due to gravity can really only sense 2 axis (can't filter out gravity)
            //here we convert those 2 axis into horizontal and vertical and normalize
            if (accel != Vector3.zero)
            {
                horizontal = EasyInputUtilities.relativeAngleInAxis(Vector3.up, -accel, Vector3.forward) / normalizeDegrees;
                vertical   = EasyInputUtilities.relativeAngleInAxis(Vector3.up, -accel, Vector3.right) / normalizeDegrees;

                horizontal *= -sensitivity;
                vertical   *= -sensitivity;
            }
            else
            {
                horizontal = 0f;
                vertical   = 0f;
            }

            actionVectorPosition.x = horizontal;
            actionVectorPosition.y = 0f;
            actionVectorPosition.z = vertical;

            myRigidbody.AddForce(actionVectorPosition);
        }
示例#11
0
        void localAxis(InputTouch touch)
        {
            //check to see if we want to effect anything
            if (preventControl)
            {
                return;
            }

            //first check to see if this is the first frame
            if (lastFrameTouch == EasyInputConstants.NOT_TOUCHING)
            {
                lastFrameTouch = touch.currentTouchPosition;
                return;
            }

            //otherwise is a continuation
            horizontal    = (touch.currentTouchPosition.x - lastFrameTouch.x) * sensitivity * Time.deltaTime * 100f;
            vertical      = (touch.currentTouchPosition.y - lastFrameTouch.y) * sensitivity * Time.deltaTime * 100f;
            actionVector3 = EasyInputUtilities.getControllerVector3(horizontal, vertical, axisHorizontal, axisVertical);

            switch (action)
            {
            case EasyInputConstants.ACTION_TYPE.Position:
                transform.position += actionVector3;
                break;

            case EasyInputConstants.ACTION_TYPE.Rotation:
                transform.Rotate(actionVector3, Space.World);
                break;

            case EasyInputConstants.ACTION_TYPE.LocalPosition:
                transform.Translate(actionVector3);
                break;

            case EasyInputConstants.ACTION_TYPE.LocalRotation:
                transform.Rotate(actionVector3);
                break;

            case EasyInputConstants.ACTION_TYPE.LocalScale:
                transform.localScale += actionVector3;
                break;

            default:
                Debug.Log("Invalid Action");
                break;
            }

            //bowling ball lane range
            temp = transform.position;
            if (transform.position.x > laneRange)
            {
                temp.x = laneRange;
            }
            else if (transform.position.x < -laneRange)
            {
                temp.x = -laneRange;
            }

            transform.position = temp;


            //move the camera to follow
            temp.x = transform.position.x;
            temp.y = 3.06f;
            temp.z = -6f;
            followingCamera.transform.position = temp;

            //also move the aim arrow
            temp              = aimArrow.position;
            temp.x            = transform.position.x;
            aimArrow.position = temp;

            lastFrameTouch = touch.currentTouchPosition;
        }
示例#12
0
        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));
                    }
                }
            }
        }
示例#13
0
        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));
                    }
                }
            }
        }
示例#14
0
        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));
                    }
                }
            }
        }