Unity RectTransUtility工具类

这个工具主要是用于动态生成UI的情况。项目中我们通过配置UI的锚点、位置以及大小(位置、大小都是通过蓝湖看到的),然后通过代码动态生成UI。

大部分情况下只要合理设置锚点,那么生成出来的UI就已经满足了适配的要求。

csharp 复制代码
using UnityEngine;

public static class RectTransUtility
{
    /// <summary>
    /// 左上 (0.0, 1.0)
    /// </summary>
    public static readonly Vector2 TopLeftVector = new(0.0f, 1.0f);
    /// <summary>
    /// 上中 (0.5, 1.0)
    /// </summary>
    public static readonly Vector2 TopCenterVector = new(0.5f, 1.0f);
    /// <summary>
    /// 右上 (1.0, 1.0)
    /// </summary>
    public static readonly Vector2 TopRightVector = new(1.0f, 1.0f);
    /// <summary>
    /// 左中 (0.0, 0.5)
    /// </summary>
    public static readonly Vector2 MiddleLeftVector = new(0.0f, 0.5f);
    /// <summary>
    /// 中心 (0.5, 0.5)
    /// </summary>
    public static readonly Vector2 MiddleCenterVector = new(0.5f, 0.5f);
    /// <summary>
    /// 右中 (1.0, 0.5)
    /// </summary>
    public static readonly Vector2 MiddleRightVector = new(1.0f, 0.5f);
    /// <summary>
    /// 左下 (0.0, 0.0)
    /// </summary>
    public static readonly Vector2 BottomLeftVector = new(0.0f, 0.0f);
    /// <summary>
    /// 下中 (0.5, 0.0)
    /// </summary>
    public static readonly Vector2 BottomCenterVector = new(0.5f, 0.0f);
    /// <summary>
    /// 右下 (1.0, 0.0)
    /// </summary>
    public static readonly Vector2 BottomRightVector = new(1.0f, 0.0f);

    /// <summary>
    /// 设置位置与大小
    /// </summary>
    public static void SetRTPosition(RectTransform rt, ERectTransAnchor anchor_pivot, float x, float y, float width, float height)
    {
        //设置锚点和轴心点
        SetRTAnchorAndPivot(rt, anchor_pivot);

        switch (anchor_pivot)
        {
            case ERectTransAnchor.TopLeft:
                rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, x, width);
                rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, y, height);
                return;

            case ERectTransAnchor.TopCenter:
                rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, y, height);
                rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, width);
                rt.anchoredPosition = new Vector2(x, rt.anchoredPosition.y);
                return;

            case ERectTransAnchor.TopRight:
                rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, x, width);
                rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, y, height);
                return;

            case ERectTransAnchor.MiddleLeft:
                rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, x, width);
                rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, height);
                rt.anchoredPosition = new Vector2(rt.anchoredPosition.x, y);
                return;

            case ERectTransAnchor.MiddleCenter:
                rt.sizeDelta = new Vector2(width, height);
                rt.anchoredPosition = new Vector2(x, y);
                return;

            case ERectTransAnchor.MiddleRight:
                rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, x, width);
                rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, height);
                rt.anchoredPosition = new Vector2(rt.anchoredPosition.x, y);
                return;

            case ERectTransAnchor.BottomLeft:
                rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, x, width);
                rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, y, height);
                return;

            case ERectTransAnchor.BottomCenter:
                rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, y, height);
                rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, width);
                rt.anchoredPosition = new Vector2(x, rt.anchoredPosition.y);
                return;

            case ERectTransAnchor.BottomRight:
                rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, x, width);
                rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, y, height);
                return;
        }

        Debug.LogWarning("[RectTransUtility.SetRTPosition] 暂不支持的锚点类型!");
    }

    /// <summary>
    /// 设置锚点和轴心点
    /// </summary>
    public static void SetRTAnchorAndPivot(RectTransform rt, ERectTransAnchor anchor_pivot)
    {
        switch (anchor_pivot)
        {
            case ERectTransAnchor.TopLeft:
                rt.anchorMin = TopLeftVector;
                rt.anchorMax = TopLeftVector;
                rt.pivot = TopLeftVector;
                return;

            case ERectTransAnchor.TopCenter:
                rt.anchorMin = TopCenterVector;
                rt.anchorMax = TopCenterVector;
                rt.pivot = TopCenterVector;
                return;

            case ERectTransAnchor.TopRight:
                rt.anchorMin = TopRightVector;
                rt.anchorMax = TopRightVector;
                rt.pivot = TopRightVector;
                return;

            case ERectTransAnchor.MiddleLeft:
                rt.anchorMin = MiddleLeftVector;
                rt.anchorMax = MiddleLeftVector;
                rt.pivot = MiddleLeftVector;
                return;

            case ERectTransAnchor.MiddleCenter:
                rt.anchorMin = MiddleCenterVector;
                rt.anchorMax = MiddleCenterVector;
                rt.pivot = MiddleCenterVector;
                return;

            case ERectTransAnchor.MiddleRight:
                rt.anchorMin = MiddleRightVector;
                rt.anchorMax = MiddleRightVector;
                rt.pivot = MiddleRightVector;
                return;

            case ERectTransAnchor.BottomLeft:
                rt.anchorMin = BottomLeftVector;
                rt.anchorMax = BottomLeftVector;
                rt.pivot = BottomLeftVector;
                return;

            case ERectTransAnchor.BottomCenter:
                rt.anchorMin = BottomCenterVector;
                rt.anchorMax = BottomCenterVector;
                rt.pivot = BottomCenterVector;
                return;

            case ERectTransAnchor.BottomRight:
                rt.anchorMin = BottomRightVector;
                rt.anchorMax = BottomRightVector;
                rt.pivot = BottomRightVector;
                return;
        }

        Debug.LogWarning("[RectTransUtility.SetRTAnchorAndPivot] 暂不支持的锚点类型!");
    }

    /// <summary>
    /// 设置背景填充/屏幕填充
    /// </summary>
    /// <param name="self"></param>
    /// <param name="left">离左边的距离(距离为正)</param>
    /// <param name="bottom">离底部的距离(距离为正)</param>
    /// <param name="right">离右边的距离(距离为负)</param>
    /// <param name="top">离顶部的距离(距离为负)</param>
    /// <returns></returns>
    public static RectTransform BgFill(this RectTransform self, float left = 0f, float bottom = 0f, float right = 0f, float top = 0f)
    {
        self.anchorMin = RectTransUtility.BottomLeftVector;
        self.anchorMax = RectTransUtility.TopRightVector;
        self.offsetMin = new Vector2(left, bottom);
        self.offsetMax = new Vector2(right, top);
        return self;
    }

    /// <summary>
    /// 锚点类型
    /// </summary>
    public enum ERectTransAnchor
    {
        /// <summary>
        /// 左上
        /// </summary>
        TopLeft = 0,
        /// <summary>
        /// 上中
        /// </summary>
        TopCenter = 1,
        /// <summary>
        /// 右上
        /// </summary>
        TopRight = 2,
        /// <summary>
        /// 左中
        /// </summary>
        MiddleLeft = 3,
        /// <summary>
        /// 中心
        /// </summary>
        MiddleCenter = 4,
        /// <summary>
        /// 右中
        /// </summary>
        MiddleRight = 5,
        /// <summary>
        /// 左下
        /// </summary>
        BottomLeft = 6,
        /// <summary>
        /// 下中
        /// </summary>
        BottomCenter = 7,
        /// <summary>
        /// 右下
        /// </summary>
        BottomRight = 8
    }
}
相关推荐
heath ceTide几秒前
轻量、优雅、高扩展的事件驱动框架——Hibiscus-Signal
java·开发语言
_extraordinary_1 分钟前
Java 常用的Arrays函数
java·开发语言
_extraordinary_5 分钟前
Java 类和对象
java·开发语言
Aliano2179 分钟前
TestNGException ClassCastException SAXParserFactoryImpl是Java自带的Xerces解析器——解决办法
java·开发语言·python
进击的小白菜20 分钟前
用Java实现单词搜索(LeetCode 79)——回溯算法详解
java·算法·leetcode
越来越无动于衷37 分钟前
手写tomcat:基本功能实现(3)
java·tomcat
Uranus^39 分钟前
使用Spring Boot和Spring Security构建安全的RESTful API
java·spring boot·spring security·jwt·restful api
qq_5432485240 分钟前
Tomcat的调优
java·tomcat
Mcworld8571 小时前
String的一些固定程序函数
java
越来越无动于衷1 小时前
手写tomcat:基本功能实现(4)
java·tomcat