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
    }
}
相关推荐
杂货铺的小掌柜几秒前
apache poi excel 字体数量限制
java·excel·poi
大厂码农老A9 分钟前
你打的日志,正在拖垮你的系统:从P4小白到P7专家都是怎么打日志的?
java·前端·后端
艾菜籽25 分钟前
Spring MVC入门补充2
java·spring·mvc
爆更小哇35 分钟前
统一功能处理
java·spring boot
程序员鱼皮36 分钟前
我造了个程序员练兵场,专治技术焦虑症!
java·计算机·程序员·编程·自学
n8n1 小时前
SpringAI 完全指南:为Java应用注入生成式AI能力
java·后端
不爱编程的小九九1 小时前
小九源码-springboot082-java旅游攻略平台
java·开发语言·旅游
只是懒得想了1 小时前
用C++实现一个高效可扩展的行为树(Behavior Tree)框架
java·开发语言·c++·design-patterns
码农阿树1 小时前
Java 离线视频目标检测性能优化:从 Graphics2D 到 OpenCV 原生绘图的 20 倍性能提升实战
java·yolo·目标检测·音视频
夫唯不争,故无尤也1 小时前
Maven创建Java项目实战全流程
java·数据仓库·hive·hadoop·maven