RectTransformUtility
源码
using scm = System.ComponentModel;
using uei = UnityEngine.Internal;
using RequiredByNativeCodeAttribute = UnityEngine.Scripting.RequiredByNativeCodeAttribute;
using UsedByNativeCodeAttribute = UnityEngine.Scripting.UsedByNativeCodeAttribute;
using System;
using UnityEngine;
using Object = UnityEngine.Object;
namespace UnityEngine
{
public sealed partial class RectTransformUtility
{
private static Vector3[] s_Corners = new Vector3[4];
private RectTransformUtility() {}
public static bool RectangleContainsScreenPoint(RectTransform rect, Vector2 screenPoint)
{
return RectangleContainsScreenPoint(rect, screenPoint, null);
}
public static bool ScreenPointToWorldPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector3 worldPoint)
{
worldPoint = Vector2.zero;
Ray ray = ScreenPointToRay(cam, screenPoint);
var plane = new Plane(rect.rotation * Vector3.back, rect.position);
float dist;
if (!plane.Raycast(ray, out dist))
return false;
worldPoint = ray.GetPoint(dist);
return true;
}
public static bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector2 localPoint)
{
localPoint = Vector2.zero;
Vector3 worldPoint;
if (ScreenPointToWorldPointInRectangle(rect, screenPoint, cam, out worldPoint))
{
localPoint = rect.InverseTransformPoint(worldPoint);
return true;
}
return false;
}
public static Ray ScreenPointToRay(Camera cam, Vector2 screenPos)
{
if (cam != null)
return cam.ScreenPointToRay(screenPos);
Vector3 pos = screenPos;
pos.z -= 100f;
return new Ray(pos, Vector3.forward);
}
public static Vector2 WorldToScreenPoint(Camera cam, Vector3 worldPoint)
{
if (cam == null)
return new Vector2(worldPoint.x, worldPoint.y);
return cam.WorldToScreenPoint(worldPoint);
}
public static Bounds CalculateRelativeRectTransformBounds(Transform root, Transform child)
{
RectTransform[] rects = child.GetComponentsInChildren<RectTransform>(false);
if (rects.Length > 0)
{
Vector3 vMin = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue);
Vector3 vMax = new Vector3(float.MinValue, float.MinValue, float.MinValue);
Matrix4x4 toLocal = root.worldToLocalMatrix;
for (int i = 0, imax = rects.Length; i < imax; i++)
{
rects[i].GetWorldCorners(s_Corners);
for (int j = 0; j < 4; j++)
{
Vector3 v = toLocal.MultiplyPoint3x4(s_Corners[j]);
vMin = Vector3.Min(v, vMin);
vMax = Vector3.Max(v, vMax);
}
}
Bounds b = new Bounds(vMin, Vector3.zero);
b.Encapsulate(vMax);
return b;
}
return new Bounds(Vector3.zero, Vector3.zero);
}
public static Bounds CalculateRelativeRectTransformBounds(Transform trans)
{
return CalculateRelativeRectTransformBounds(trans, trans);
}
public static void FlipLayoutOnAxis(RectTransform rect, int axis, bool keepPositioning, bool recursive)
{
if (rect == null)
return;
if (recursive)
{
for (int i = 0; i < rect.childCount; i++)
{
RectTransform childRect = rect.GetChild(i) as RectTransform;
if (childRect != null)
FlipLayoutOnAxis(childRect, axis, false, true);
}
}
Vector2 pivot = rect.pivot;
pivot[axis] = 1.0f - pivot[axis];
rect.pivot = pivot;
if (keepPositioning)
return;
Vector2 anchoredPosition = rect.anchoredPosition;
anchoredPosition[axis] = -anchoredPosition[axis];
rect.anchoredPosition = anchoredPosition;
Vector2 anchorMin = rect.anchorMin;
Vector2 anchorMax = rect.anchorMax;
float temp = anchorMin[axis];
anchorMin[axis] = 1 - anchorMax[axis];
anchorMax[axis] = 1 - temp;
rect.anchorMin = anchorMin;
rect.anchorMax = anchorMax;
}
public static void FlipLayoutAxes(RectTransform rect, bool keepPositioning, bool recursive)
{
if (rect == null)
return;
if (recursive)
{
for (int i = 0; i < rect.childCount; i++)
{
RectTransform childRect = rect.GetChild(i) as RectTransform;
if (childRect != null)
FlipLayoutAxes(childRect, false, true);
}
}
rect.pivot = GetTransposed(rect.pivot);
rect.sizeDelta = GetTransposed(rect.sizeDelta);
if (keepPositioning)
return;
rect.anchoredPosition = GetTransposed(rect.anchoredPosition);
rect.anchorMin = GetTransposed(rect.anchorMin);
rect.anchorMax = GetTransposed(rect.anchorMax);
}
private static Vector2 GetTransposed(Vector2 input)
{
return new Vector2(input.y, input.x);
}
}
}
🔚