Пример #1
0
        public bool TryGetPoint(RectTransform canvasRectTransform, ref Vector3 point, Camera camera = null)
        {
            if (camera == null)
            {
                camera = Camera.main;
            }

            if (camera != null)
            {
                var worldPoint = transform != null?transform.TransformPoint(localOffset) : localOffset;

                var viewportPoint = GetViewportPoint(camera, worldPoint);

                // Convert viewport point to canvas point
                var canvasRect = canvasRectTransform.rect;
                var canvasX    = canvasRect.xMin + canvasRect.width * viewportPoint.x + pixelOffset.x;
                var canvasY    = canvasRect.yMin + canvasRect.height * viewportPoint.y + pixelOffset.y;

                // Convert canvas point to world point
                point = canvasRectTransform.TransformPoint(canvasX, canvasY, 0.0f);

                // If outside frustum, return false, but keep the point
                if (LeanGui.InvaidViewportPoint(camera, viewportPoint) == true)
                {
                    return(false);
                }
                else
                {
                    return(true);
                }
            }

            return(false);
        }
Пример #2
0
        private bool UpdateRect(RectTransform target)
        {
            var camera = worldCamera;

            if (camera == null)
            {
                camera = Camera.main;
            }

            if (camera != null)
            {
                if (rectTransform == null)
                {
                    rectTransform = GetComponent <RectTransform>();
                }

                if (canvasRectTransform == null)
                {
                    var canvas = GetComponentInParent <Canvas>();

                    if (canvas == null)
                    {
                        throw new System.Exception("Couldn't find attached canvas??");
                    }

                    canvasRectTransform = canvas.GetComponent <RectTransform>();
                }

                // Calculate viewport/anchor points
                var min     = target.rect.min;
                var max     = target.rect.max;
                var targetA = target.TransformPoint(min.x, min.y, 0.0f);
                var targetB = target.TransformPoint(max.x, min.y, 0.0f);
                var targetC = target.TransformPoint(min.x, max.y, 0.0f);
                var targetD = target.TransformPoint(max.x, max.y, 0.0f);

                var worldSpace     = target.GetComponentInParent <Canvas>().renderMode == RenderMode.WorldSpace;
                var viewportPointA = WorldToViewportPoint(camera, targetA, worldSpace);
                var viewportPointB = WorldToViewportPoint(camera, targetB, worldSpace);
                var viewportPointC = WorldToViewportPoint(camera, targetC, worldSpace);
                var viewportPointD = WorldToViewportPoint(camera, targetD, worldSpace);

                // If outside frustum, hide line out of view
                if (LeanGui.InvaidViewportPoint(camera, viewportPointA) == true || LeanGui.InvaidViewportPoint(camera, viewportPointB) == true ||
                    LeanGui.InvaidViewportPoint(camera, viewportPointC) == true || LeanGui.InvaidViewportPoint(camera, viewportPointD) == true)
                {
                    viewportPointA = viewportPointB = viewportPointC = viewportPointD = new Vector3(10.0f, 10.0f);
                }

                var minX = Mathf.Min(Mathf.Min(viewportPointA.x, viewportPointB.x), Mathf.Min(viewportPointC.x, viewportPointD.x));
                var minY = Mathf.Min(Mathf.Min(viewportPointA.y, viewportPointB.y), Mathf.Min(viewportPointC.y, viewportPointD.y));
                var maxX = Mathf.Max(Mathf.Max(viewportPointA.x, viewportPointB.x), Mathf.Max(viewportPointC.x, viewportPointD.x));
                var maxY = Mathf.Max(Mathf.Max(viewportPointA.y, viewportPointB.y), Mathf.Max(viewportPointC.y, viewportPointD.y));

                // Convert viewport points to canvas points
                var canvasRect = canvasRectTransform.rect;
                var canvasXA   = canvasRect.xMin + canvasRect.width * minX;
                var canvasYA   = canvasRect.yMin + canvasRect.height * minY;
                var canvasXB   = canvasRect.xMin + canvasRect.width * maxX;
                var canvasYB   = canvasRect.yMin + canvasRect.height * maxY;

                // Find center, reset anchor, and convert canvas point to world point
                var canvasX = (canvasXA + canvasXB) * 0.5f;
                var canvasY = (canvasYA + canvasYB) * 0.5f;

                rectTransform.anchorMin = rectTransform.anchorMax = Vector2.zero;
                rectTransform.sizeDelta = new Vector2(canvasXB - canvasXA, canvasYB - canvasYA);
                rectTransform.position  = canvasRectTransform.TransformPoint(canvasX, canvasY, 0.0f);

                // Get vector between points

                return(true);
            }

            return(false);
        }