4.控件位置信息类

4.控件位置信息类


4.1 知识点

创建控件信息类

控件位置信息类

控件位置信息类是用来表示位置、计算位置相关信息的类,不需要继承MonoBehaviour

自定义控件要加[System.Serializable]特性才能在Inspector面板显示。

[System.Serializable]
public class CustomGUIPos
{
}

定义对齐方式九宫格枚举

对齐方式九宫格枚举定义如下:

public enum E_Alignment_Type
{
    Up,
    Down,
    Left,
    Right,
    Center,
    Left_Up,
    Left_Down,
    Right_Up,
    Right_Down,
}

添加计算真实位置所需要得到变量

在计算真实位置时,需要考虑以下变量:

  • 真实的位置(Rect类型)
  • 屏幕九宫格对齐方式(E_Alignment_Type类型)
  • UI控件中心对齐方式(E_Alignment_Type类型)
  • UI控件偏移位置(Vector2类型)
  • 宽度和高度(float类型)
//主要是处理 控件位置相关的内容
//要完成 分辨率自适应的相关计算

//真实的位置
//该位置信息 会用来返回给外部 用于绘制控件 需要对它进行 计算
private Rect rPos = new Rect(0, 0, 100, 100);

//屏幕九宫格对齐方式
public E_Alignment_Type screen_Alignment_Type = E_Alignment_Type.Center;

//UI控件中心对齐方式
public E_Alignment_Type control_Center_Alignment_Type = E_Alignment_Type.Center;

//UI控件偏移位置
public Vector2 pos;

//宽高
public float width = 100;
public float height = 50;

//用于计算的 中心点 成员变量
private Vector2 centerPos;

添加计算中心点偏移的方法和计算最终相对坐标位置的方法

计算中心点偏移方法

该方法用于计算控件中心点的偏移位置,根据不同的对齐方式进行计算。
主要是修改中心偏移位置centerPos的xy到正确的值。

//计算中心点偏移的方法
private void CalcCenterPos()
{
    switch (control_Center_Alignment_Type)
    {
        case E_Alignment_Type.Up:
            centerPos.x = -width / 2;
            centerPos.y = 0;
            break;
        case E_Alignment_Type.Down:
            centerPos.x = -width / 2;
            centerPos.y = -height;
            break;
        case E_Alignment_Type.Left:
            centerPos.x = 0;
            centerPos.y = -height/2;
            break;
        case E_Alignment_Type.Right:
            centerPos.x = -width;
            centerPos.y = -height/2;
            break;
        case E_Alignment_Type.Center:
            centerPos.x = -width / 2;
            centerPos.y = -height/2;
            break;
        case E_Alignment_Type.Left_Up:
            centerPos.x = 0;
            centerPos.y = 0;
            break;
        case E_Alignment_Type.Left_Down:
            centerPos.x = 0;
            centerPos.y = -height;
            break;
        case E_Alignment_Type.Right_Up:
            centerPos.x = -width;
            centerPos.y = 0;
            break;
        case E_Alignment_Type.Right_Down:
            centerPos.x = -width;
            centerPos.y = -height;
            break;
    }
}

计算最终相对坐标位置方法

该方法用于计算控件最终相对于屏幕的位置,考虑了屏幕九宫格对齐方式和控件中心对齐方式。
主要是修改真实位置rPos的xy到正确的值。
会用到公式:屏幕相对位置 + 中心偏移位置 + 控件偏移位置 = 真实位置

//计算最终相对坐标位置的方法
private void CalcPos()
{
    switch (screen_Alignment_Type)
    {
        case E_Alignment_Type.Up:
            rPos.x = Screen.width/2 + centerPos.x + pos.x;
            rPos.y = 0 + centerPos.y + pos.y;
            break;
        case E_Alignment_Type.Down:
            rPos.x = Screen.width/2 + centerPos.x + pos.x;
            rPos.y = Screen.height + centerPos.y - pos.y;
            break;
        case E_Alignment_Type.Left:
            rPos.x = centerPos.x + pos.x;
            rPos.y = Screen.height/2 + centerPos.y + pos.y;
            break;
        case E_Alignment_Type.Right:
            rPos.x = Screen.width + centerPos.x - pos.x;
            rPos.y = Screen.height / 2 + centerPos.y + pos.y;
            break;
        case E_Alignment_Type.Center:
            rPos.x = Screen.width / 2 + centerPos.x + pos.x;
            rPos.y = Screen.height / 2 + centerPos.y + pos.y;
            break;
        case E_Alignment_Type.Left_Up:
            rPos.x = centerPos.x + pos.x;
            rPos.y = centerPos.y + pos.y;
            break;
        case E_Alignment_Type.Left_Down:
            rPos.x = centerPos.x + pos.x;
            rPos.y = Screen.height + centerPos.y - pos.y;
            break;
        case E_Alignment_Type.Right_Up:
            rPos.x = Screen.width + centerPos.x - pos.x;
            rPos.y = centerPos.y + pos.y;
            break;
        case E_Alignment_Type.Right_Down:
            rPos.x = Screen.width + centerPos.x - pos.x;
            rPos.y = Screen.height + centerPos.y - pos.y;
            break;
    }
}

计算得到最终绘制的位置和宽高

通过该方法计算得到最终绘制的位置和宽高,用于在GUI中绘制控件。

/// <summary>
/// 计算得到最终绘制的位置和宽高
/// </summary>
public Rect Pos
{
    get
    {
        //计算中心点偏移的方法
        CalcCenterPos();

        //计算最终相对坐标位置的方法
        CalcPos();

        //宽高直接赋值 返回给外部 别人直接使用来绘制控件
        rPos.width = width;
        rPos.height = height;

        return rPos;
    }
}

4.2 知识点代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 对齐方式九宫格枚举
/// </summary>
public enum E_Alignment_Type
{
    Up,
    Down,
    Left,
    Right,
    Center,
    Left_Up,
    Left_Down,
    Right_Up,
    Right_Down,
}

/// <summary>
/// 控件位置信息类 是用来表示位置 计算位置相关信息的 不需要继承mono
/// </summary>
/// 

//自定义控件要加[System.Serializable]特性才能在Inspector面板显示
[System.Serializable]
public class CustomGUIPos
{
    //主要是处理 控件位置相关的内容
    //要完成 分辨率自适应的相关计算

    //真实的位置
    //该位置信息 会用来返回给外部 用于绘制控件 需要对它进行 计算
    private Rect rPos = new Rect(0, 0, 100, 100);

    //屏幕九宫格对齐方式
    public E_Alignment_Type screen_Alignment_Type = E_Alignment_Type.Center;

    //UI控件中心对齐方式
    public E_Alignment_Type control_Center_Alignment_Type = E_Alignment_Type.Center;

    //UI控件偏移位置
    public Vector2 pos;

    //宽高
    public float width = 100;
    public float height = 50;

    //用于计算的 中心点 成员变量
    private Vector2 centerPos;
    
    //计算中心点偏移的方法
    private void CalcCenterPos()
    {
        switch (control_Center_Alignment_Type)
        {
            case E_Alignment_Type.Up:
                centerPos.x = -width / 2;
                centerPos.y = 0;
                break;
            case E_Alignment_Type.Down:
                centerPos.x = -width / 2;
                centerPos.y = -height;
                break;
            case E_Alignment_Type.Left:
                centerPos.x = 0;
                centerPos.y = -height/2;
                break;
            case E_Alignment_Type.Right:
                centerPos.x = -width;
                centerPos.y = -height/2;
                break;
            case E_Alignment_Type.Center:
                centerPos.x = -width / 2;
                centerPos.y = -height/2;
                break;
            case E_Alignment_Type.Left_Up:
                centerPos.x = 0;
                centerPos.y = 0;
                break;
            case E_Alignment_Type.Left_Down:
                centerPos.x = 0;
                centerPos.y = -height;
                break;
            case E_Alignment_Type.Right_Up:
                centerPos.x = -width;
                centerPos.y = 0;
                break;
            case E_Alignment_Type.Right_Down:
                centerPos.x = -width;
                centerPos.y = -height;
                break;
        }
    }

    //计算最终相对坐标位置的方法
    private void CalcPos()
    {
        switch (screen_Alignment_Type)
        {
            case E_Alignment_Type.Up:
                rPos.x = Screen.width/2 + centerPos.x + pos.x;
                rPos.y = 0 + centerPos.y + pos.y;
                break;
            case E_Alignment_Type.Down:
                rPos.x = Screen.width/2 + centerPos.x + pos.x;
                rPos.y = Screen.height + centerPos.y - pos.y;
                break;
            case E_Alignment_Type.Left:
                rPos.x = centerPos.x + pos.x;
                rPos.y = Screen.height/2 + centerPos.y + pos.y;
                break;
            case E_Alignment_Type.Right:
                rPos.x = Screen.width + centerPos.x - pos.x;
                rPos.y = Screen.height / 2 + centerPos.y + pos.y;
                break;
            case E_Alignment_Type.Center:
                rPos.x = Screen.width / 2 + centerPos.x + pos.x;
                rPos.y = Screen.height / 2 + centerPos.y + pos.y;
                break;
            case E_Alignment_Type.Left_Up:
                rPos.x = centerPos.x + pos.x;
                rPos.y = centerPos.y + pos.y;
                break;
            case E_Alignment_Type.Left_Down:
                rPos.x = centerPos.x + pos.x;
                rPos.y = Screen.height + centerPos.y - pos.y;
                break;
            case E_Alignment_Type.Right_Up:
                rPos.x = Screen.width + centerPos.x - pos.x;
                rPos.y = centerPos.y + pos.y;
                break;
            case E_Alignment_Type.Right_Down:
                rPos.x = Screen.width + centerPos.x - pos.x;
                rPos.y = Screen.height + centerPos.y - pos.y;
                break;
        }
    }

    /// <summary>
    /// 计算得到最终绘制的位置和宽高
    /// </summary>
    public Rect Pos
    {
        get
        {
            //计算中心点偏移的方法
            CalcCenterPos();

            //计算最终相对坐标位置的方法
            CalcPos();

            //宽高直接赋值 返回给外部 别人直接使用来绘制控件
            rPos.width = width;
            rPos.height = height;

            return rPos;
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏