// Copyright (c) 2015 - 2023 Doozy Entertainment. All Rights Reserved. // This code can only be used under the standard Unity Asset Store End User License Agreement // A Copy of the EULA APPENDIX 1 is available at http://unity3d.com/company/legal/as_terms using UnityEngine; using static UnityEngine.Mathf; namespace Doozy.Runtime.UIDesigner { public static class RectTransformExtensions { /// Get UIDesigner rect /// Target RectTransform public static Rect DesignerRect(this RectTransform target) { Rect targetRect = target.rect; Vector3 targetLocalEulerAngles = target.localEulerAngles; Vector3 tempLocalScale = target.localScale; Vector2 targetLocalScale = new Vector2(Abs(tempLocalScale.x), Abs(tempLocalScale.y)); float width = targetRect.width * targetLocalScale.x; float height = targetRect.height * targetLocalScale.y; float x = targetRect.x + targetRect.width / 2f - width / 2f; float y = targetRect.y + targetRect.height / 2f - height / 2f; float rotationOffsetX = 0f; float rotationOffsetY = 0f; float newWidth; float newHeight; float angle = Abs(targetLocalEulerAngles.z % 180); float theta = angle * Deg2Rad; if (Approximately(angle, 0) || Approximately(angle, 90)) { newWidth = width; newHeight = height; } else if (angle < 90) { newWidth = width * Cos(theta) + height * Sin(theta); newHeight = width * Sin(theta) + height * Cos(theta); } else { angle -= 90; theta = angle * Deg2Rad; newWidth = height * Cos(theta) + width * Sin(theta); newHeight = height * Sin(theta) + width * Cos(theta); } rotationOffsetX = (newWidth - width) / 2f; rotationOffsetY = (newHeight - height) / 2f; return new Rect(x + rotationOffsetX, y + rotationOffsetY, newWidth, newHeight); } /// Change the RectTransform pivot without changing the position /// Target RectTransform /// New pivot value public static RectTransform ChangePivot(this RectTransform target, Vector2 pivot) { Vector2 sizeDelta = target.sizeDelta; Vector3 localScale = target.localScale; Vector2 deltaPivot = target.pivot - pivot; float deltaX = deltaPivot.x * sizeDelta.x * localScale.x; float deltaY = deltaPivot.y * sizeDelta.y * localScale.y; float rot = target.rotation.eulerAngles.z * PI / 180; var deltaPosition = new Vector3(Cos(rot) * deltaX - Sin(rot) * deltaY, Sin(rot) * deltaX + Cos(rot) * deltaY); target.pivot = pivot; target.localPosition -= deltaPosition; return target; } } }