public bool TryQuery <T>(GameObject gameObject, Vector2 screenPosition, ref T result, ref Component root, ref Vector3 worldPosition)
        {
            var camera       = LeanHelper.GetCamera(Camera, gameObject);
            var bestHit      = default(Component);
            var bestDistance = float.PositiveInfinity;
            var bestPosition = default(Vector3);

            if (camera != null)
            {
                if (camera.pixelRect.Contains(screenPosition) == true)
                {
                    DoRaycast3D(camera, screenPosition, ref bestHit, ref bestDistance, ref bestPosition);
                    DoRaycast2D(camera, screenPosition, ref bestHit, ref bestDistance, ref bestPosition);
                    DoRaycastUI(screenPosition, ref bestHit, ref bestDistance, ref bestPosition);
                }
            }

            if (bestHit != null)
            {
                worldPosition = bestPosition;

                return(TryResult(bestHit, ref result, ref root));
            }

            return(false);
        }
Example #2
0
        /// <summary>This method will automatically update the <b>Pitch</b> and <b>Yaw</b> values based on the specified position in screen space.</summary>
        public void RotateToScreenPosition(Vector2 screenPosition)
        {
            var camera = LeanHelper.GetCamera(Camera, gameObject);

            if (camera != null)
            {
                var xyz = camera.ScreenPointToRay(screenPosition).direction;

                RotateToDirection(xyz);
            }
        }
        protected virtual void LateUpdate()
        {
            // Make sure the camera exists
            var camera = LeanHelper.GetCamera(Camera, gameObject);

            if (camera != null)
            {
                if (Plane != null)
                {
                    var ray = Camera.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0.0f));
                    var hit = default(Vector3);

                    if (Plane.TryRaycast(ray, ref hit, 0.0f, false) == true)
                    {
                        var oldPosition = transform.position;
                        var local       = Plane.transform.InverseTransformPoint(hit);
                        var snapped     = local;
                        var size        = new Vector2(Camera.orthographicSize * Camera.aspect, Camera.orthographicSize);

                        if (Plane.ClampX == true)
                        {
                            var min = Plane.MinX + size.x;
                            var max = Plane.MaxX - size.x;

                            if (min > max)
                            {
                                snapped.x = (min + max) * 0.5f;
                            }
                            else
                            {
                                snapped.x = Mathf.Clamp(local.x, min, max);
                            }
                        }

                        if (Plane.ClampY == true)
                        {
                            var min = Plane.MinY + size.y;
                            var max = Plane.MaxY - size.y;

                            if (min > max)
                            {
                                snapped.y = (min + max) * 0.5f;
                            }
                            else
                            {
                                snapped.y = Mathf.Clamp(local.y, min, max);
                            }
                        }

                        if (local != snapped)
                        {
                            var delta       = oldPosition - hit;
                            var newPosition = Plane.transform.TransformPoint(snapped) + delta;

                            if (Mathf.Approximately(oldPosition.x, newPosition.x) == false ||
                                Mathf.Approximately(oldPosition.y, newPosition.y) == false ||
                                Mathf.Approximately(oldPosition.z, newPosition.z) == false)
                            {
                                transform.position = newPosition;
                            }
                        }
                    }
                }
            }
            else
            {
                Debug.LogError("Failed to find camera. Either tag your cameras MainCamera, or set one in this component.", this);
            }
        }