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
    }
}
相关推荐
vx1_Biye_Design1 分钟前
基于Spring Boot+Vue的学生管理系统设计与实现-计算机毕业设计源码46223
java·vue.js·spring boot·spring·eclipse·tomcat·maven
vx_Biye_Design2 分钟前
基于Spring Boot+vue的湖北旅游景点门票预约平台的设计--毕设附源码29593
java·vue.js·spring boot·spring cloud·servlet·eclipse·课程设计
hay_lee21 分钟前
Spring AI实现对话聊天-流式输出
java·人工智能·ollama·spring ai
Hx_Ma1626 分钟前
SpringBoot数据源自动管理
java·spring boot·spring
SunnyDays101127 分钟前
Java 高效实现 CSV 转 Excel
java·csv转excel
starfire_hit28 分钟前
JAVAWEB根据前台请求获取用户IP
java·服务器·网络
fengxin_rou30 分钟前
[Redis从零到精通|第四篇]:缓存穿透、雪崩、击穿
java·redis·缓存·mybatis·idea·多线程
像少年啦飞驰点、33 分钟前
从零开始学 RabbitMQ:小白也能懂的消息队列实战指南
java·spring boot·微服务·消息队列·rabbitmq·异步编程
宠友信息41 分钟前
2025社交+IM及时通讯社区APP仿小红书小程序
java·spring boot·小程序·uni-app·web app
java1234_小锋41 分钟前
Java高频面试题:Spring和SpringBoot的关系和区别?
java·spring boot·spring