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
    }
}
相关推荐
杨杨杨大侠8 小时前
都能接模型、RAG 和 MCP,Java Agent 框架到底差在哪?
java
Thinker QAQ9 小时前
并发编程(九):BlockingQueue 与 Channel——语言层的原子性、可见性与有序性
java·python·go·并发编程·channel·blockingqueue·message passing
霸道流氓气质11 小时前
RAG 可观测性与生产监控实战:四层遥测模型、五大仪表盘与 OpenTelemetry 全链路追踪的 Java 生产级实现
java·人工智能·python
AOI小白新手上路11 小时前
autodl常用的tar 打包下载(数据集)命令手册:逐段拆解与套用模板
java·大数据·数据库
阿松爱学习12 小时前
【Unity开发】监听Scene场景事件
unity·c#
dishugj12 小时前
系统架构风险点、敏感点和权衡点的概念和区分
java·开发语言
苜蓿muxu12 小时前
常用代码命名规范
java
马优晨13 小时前
JAVA 中 VO 实体类是什么意思,为什么要做这个
java·开发语言·状态模式·java vo·java vo是什么
Baron X13 小时前
Eclipse Temurin 21 (JRE) Alpine 镜像获取、离线导入与推送操作
java·docker·eclipse·temurin