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
    }
}
相关推荐
Magnum Lehar1 小时前
ApophisZerg游戏引擎项目目录展示
人工智能·vscode·编辑器·游戏引擎
西瓜本瓜@2 小时前
在Android中如何使用Protobuf上传协议
android·java·开发语言·git·学习·android-studio
言之。2 小时前
别学了,打会王者吧
java·python·mysql·容器·spark·php·html5
机智的人猿泰山2 小时前
java kafka
java·开发语言·kafka
Algorithm15762 小时前
谈谈接口和抽象类有什么区别?
java·开发语言
细心的莽夫3 小时前
SpringCloud 微服务复习笔记
java·spring boot·笔记·后端·spring·spring cloud·微服务
264玫瑰资源库4 小时前
问道数码兽 怀旧剧情回合手游源码搭建教程(反查重优化版)
java·开发语言·前端·游戏
pwzs4 小时前
Java 中 String 转 Integer 的方法与底层原理详解
java·后端·基础
东阳马生架构4 小时前
Nacos简介—2.Nacos的原理简介
java
Tandy12356_4 小时前
Godot开发2D冒险游戏——第一节:主角登场!
python·游戏引擎·godot