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); }
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); }