【Unity之IMGUI】—位置信息类和控件基类的封装

news2024/9/20 12:40:59

在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏

🅰️IMGUI封装实践



文章目录

    • 🅰️IMGUI封装实践
    • 前言
    • 🎶(==A==) UI中的九宫格原理
    • 🎶(==B==) 位置信息类UML
    • 🎶(==C==) 控件基类的封装创建
    • 🅰️


前言

在这里插入图片描述

缺点1:无法在编译过程进行可视化调整
缺点2:无法分辨率自适应

在这里插入图片描述


🎶(A UI中的九宫格原理


在这里插入图片描述

在这里插入图片描述


🎶(B 位置信息类UML


作用:让控件根据调整对齐
在这里插入图片描述
在这里插入图片描述

  • 最终代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:    
//___________功能:位置信息类 的封装   
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------

/// <summary>
/// 选择对齐方式的枚举
/// </summary>
public enum E_Alignment
{
    Up,
    Down,
    Left,
    Right,
    Center,
    Left_Up,
    Left_Down,
    Right_Up,
    Right_Down
}

[System.Serializable] //让
/// <summary>
/// 作用:为完成分辨率的相关计算
/// </summary>
public class PosInformation
{   
    //-----------
    //可视化部分
    //-----------
    public Vector2 posOffset;   //控件的偏移量
    public float width = 100;
    public float height = 50;   //控件的宽高
    //-----------
    //私有部分
    //-----------
    private E_Alignment screen_Alignemnt;   //屏幕的对齐类型
    private E_Alignment contorl_Alignment;  //控件的对齐类型
    private Vector2 centerPos;              //控件的基点(中心点)
    private Rect CorPos = new Rect(0, 0, 100, 100);  //控件的最终坐标
    //属性
    public Rect LastPos
    {
        get
        {
            MutiCenterPos();
            MutiLastPos();   //进行坐标位置的最终计算

            CorPos.width = width;
            CorPos.height = height;
            //宽高进行赋值        
            return CorPos;
        }                    //返回经过计算完毕的控件位置信息Rcet类型
    }

    /// <summary>
    /// 控件中心点偏移的方法计算
    /// </summary>
    private  void MutiCenterPos()
    {
        switch (contorl_Alignment)
        {
            case E_Alignment.Up:
                centerPos.x = width / 2;
                centerPos.y = 0;
                break;
            case E_Alignment.Down:
                centerPos.x = width / 2;
                centerPos.y = height;
                break;
            case E_Alignment.Left:
                centerPos.x = 0;
                centerPos.y = height / 2;
                break;
            case E_Alignment.Right:
                centerPos.x = width;
                centerPos.y = height / 2;
                break;
            case E_Alignment.Center:
                centerPos.x = width / 2;
                centerPos.y = height / 2;
                break;
            case E_Alignment.Left_Up:
                centerPos.x = 0;
                centerPos.y = 0;
                break;
            case E_Alignment.Left_Down:
                centerPos.x = 0;
                centerPos.y = height;
                break;
            case E_Alignment.Right_Up:
                centerPos.x = width;
                centerPos.y = 0;
                break;
            case E_Alignment.Right_Down:
                centerPos.x = width;
                centerPos.y = height;
                break;
            default:
                break;
        }
    }

    /// <summary>
    /// 控件的最终位置计算
    /// </summary>
    private void MutiLastPos()
    {
        switch (screen_Alignemnt )
        {
            case E_Alignment.Up:
                CorPos.x = Screen.width / 2 + centerPos.x + posOffset.x;
                CorPos.y = 0 + centerPos.y + posOffset.y;
                break;
            case E_Alignment.Down:
                CorPos.x = Screen.width / 2 + centerPos.x + posOffset.x;
                CorPos.y = Screen.height + centerPos.y - posOffset.y;
                break;
            case E_Alignment.Left:
                CorPos .x = centerPos.x + posOffset.x;
                CorPos.y = Screen.height / 2 + centerPos.y + posOffset.y;
                break;
            case E_Alignment.Right:
                CorPos.x = Screen.width + centerPos.x - posOffset.x ;
                CorPos.y = Screen.height / 2 + centerPos.y + posOffset.y ;
                break;
            case E_Alignment.Center:
                CorPos.x = Screen.width / 2 + centerPos.x + posOffset.x;
                CorPos.y = Screen.height / 2 + centerPos.y + posOffset.y;
                break;
            case E_Alignment.Left_Up:
                CorPos.x = centerPos.x + posOffset.x;
                CorPos.y = centerPos.y + posOffset.y;
                break;
            case E_Alignment.Left_Down:
                CorPos.x = centerPos.x + posOffset.x;
                CorPos.y = Screen.height + centerPos.y - posOffset.y; 
                break;
            case E_Alignment.Right_Up:
                CorPos.x = Screen.width + centerPos.x - posOffset.x;
                CorPos.y =  centerPos.y + posOffset.y;
                break;
            case E_Alignment.Right_Down:
                CorPos.x = Screen.width + centerPos.x - posOffset.x;
                CorPos.y = Screen.height + centerPos.y - posOffset.y;
                break;
            default:
                break;
        }
    }
}


🎶(C 控件基类的封装创建


在这里插入图片描述

特点:
类是抽象类:原因基类不需修改子类需要修改
两个抽象方法:原因不同控件的自定义类型不同,所以需要被重写

在这里插入图片描述

  • 最终代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 控件基类的创建
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------

/// <summary>
    /// 自定义样式枚举选择(开关)
    /// </summary>
public enum switchStyle
{
    on,
    off
}
public abstract class ControlFather : MonoBehaviour
{
    //---------
    //可视化部分
    //---------
    public PosInformation ContorlPosition; //位置信息
    public GUIContent ContorlContent;      //内容信息
    public GUIStyle ContorlStyle;          //自定义信息
    public switchStyle onOrOff = switchStyle.off; //默认是关闭

    /// <summary>
    /// 判断自定义开关
    /// </summary>
    public void Judge()
    {
        switch (onOrOff)
        {
            case switchStyle.on:
                OnDrawstyle(); 
                break;
            case switchStyle.off:
                OffDrawStyle();
                break;
            default:
                break;
        }
    }

    protected abstract void OffDrawStyle(); //关闭时执行的行为
    protected abstract void OnDrawstyle();  //开启时执行的行为

}

🅰️


⭐【Unityc#专题篇】之c#进阶篇】

⭐【Unityc#专题篇】之c#核心篇】

⭐【Unityc#专题篇】之c#基础篇】

⭐【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】—进阶章题单实践练习

⭐【Unityc#专题篇】—基础章题单实践练习

【Unityc#专题篇】—核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/674116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

出现线程死锁缺陷一般有那些原因?该怎么解决?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言什么是线程死锁线程…

【Python】文件操作 ⑤ ( 文件操作 | 以只读模式向已有文件写入数据 | 以追加模式向已有文件写入数据 | 以追加模式打开一个不存在的文件 )

文章目录 一、向文件写出数据1、以只读模式向已有文件写入数据2、以追加模式向已有文件写入数据3、以追加模式打开一个不存在的文件 一、向文件写出数据 1、以只读模式向已有文件写入数据 使用 write 函数向已有文件写入数据 , 会清空该文件中的数据 , 代码展示如下 : file1.t…

当mysql遇上PHP

一.利用PHP连接mySQL数据库 这要从一个故事说起。 某一天&#xff0c;一位名叫MySQL的农夫的一把斧子&#xff08;数据库操作&#xff09;掉进了一条名为PHP的河里&#xff0c;这时候&#xff0c;一位好心的河神出现了 PHP河的河神问他。。。。 下面&#xff0c;咱们还是说正经…

Kubernetes API Server源码学习(三):KubeAPIServer、APIExtensionsServer、AggregatorServer

本文基于Kubernetes v1.22.4版本进行源码学习 9、KubeAPIServer GenericAPIServer提供了一些通用的功能&#xff0c;其他的Server基于GenericAPIServer进行拓展&#xff0c;代码量就会减少许多 KubeAPIServer负责处理Kubernetes内建资源的REST请求&#xff0c;比如Pod、Deploy…

C/C++系列系统学习目录

友情链接&#xff1a;专栏地址 文章目录 一、C语言篇二、C篇 编程规范&#xff1a;C/C语言编程规范 一、C语言篇 章节内容1.初识C语言【C语言篇】初识C语言2.C语言最基础入门【C语言篇】C语言最基础入门3.C语言的输入输出相关知识【C语言篇】C语言的输入/输出相关知识4.C语言…

【Pytest实战】Pytest+Allure+Jenkins自动化测试框架搭建

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

从零开始理解Linux中断架构(5)--EL跃迁与Linux用户/内核态

ARM64系统Reset时,PE进入最高的异常级别运行状态 1)Reset后最高异常级别可以选用任何一种运行状态 2)cold reset由输入信号配置,warm reset由RMR_ELx.AA64配置 1)内核态EL1迁移到EL0t 上一节我们提到需要仔细理解的图吗?eret这条特殊的异常返回指令。 我们期望…

《机器学习公式推导与代码实现》chapter14-CatBoost

《机器学习公式推导与代码实现》学习笔记&#xff0c;记录一下自己的学习过程&#xff0c;详细的内容请大家购买作者的书籍查阅。 CatBoost CatBoost是俄罗斯搜索引擎巨头Yandex于2017年开源的一款GBDT计算框架&#xff0c;因能够高效处理数据中的类别特征而取名为CatBoost(C…

一时兴起之matlab学习记录

是学习记录&#xff0c;会有错误的地方 安装的话看其他文章把 小操作 查看历史命令 在输入命令的地方&#xff0c;按下↑的方向键即可 变量 对大小写敏感若想以指定的类型存储就是 类型名(值),如 int16(4)&#xff0c;这个也可以强转变量名字有限制&#xff0c;键入namele…

10分钟搭建Stable Diffusion

前言 人工智能生成内容&#xff08;Artificial Intelligence Generated Content&#xff0c;简称 AIGC&#xff09;是当下最火的概念之一。AIGC 被认为是继专业生成内容&#xff08;Professional Generated Content, PGC&#xff09;和用户生成内容&#xff08;User Generated…

【MySQL】数据库基础 ③

上一章&#xff1a; 【MySQL】数据库基础 ② ✍临时表 说明&#xff1a; MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见&#xff0c;…

局域网实验报告

计算机网络综合实训 实训报告一 所在院系 计算机与信息工程学院 学科专业名称 计算机科学与技术 导师及职称 柯宗武 教授 提交时间 2023.3.10 网络层实验报告 &#xff08;湖北师范大学计算机与信息工程学院 中国 黄石 435002&#xff09; 1 集线器与交换机的对比实验 1.1 背…

【Python】自动化构建项目结构样式

引言 在使用Python或者其它编程语言的项目时候&#xff0c;编写README.md 往往是不可或缺的&#xff1b; 而在README.md 中&#xff0c;关于项目结构的样式展示&#xff0c;这个是可选的。不展示也无伤大雅&#xff0c;但有展示的话&#xff0c;有以下优点&#xff1a; 提供…

第九章 总结及作业(4)【编译原理】

第九章 总结及作业&#xff08;4&#xff09;【编译原理】 前言推荐第九章 运行时存储空间组织9.1 目标程序运行时的活动9.1.1过程的活动9.1.2参数传递 9.2 运行时存储器的划分9.2.1运行时存储器的划分9.2.2 活动记录9.2.3 存储分配策咯 9.3 静态存储分配9.3.1数据区*9.3.2公用…

基于深度学习的人脸检测技术

用到环境 1、pycharm community edition 2022.3.2 2、Python 3.10 整篇内容都已上传至我的csdn资源中&#xff0c;想用的请移步。 流程 多任务级联卷积神经网络(Multi-task Cascaded Convolutional Networks, MTCNN)算法进行人脸检测 普通人脸检测 单人人脸检测 图1 单人人…

我最喜欢的编程语言是python,以及我的见解!!

这里写目录标题 我最喜欢的编程语言&#xff1a;1、我个人认为编程语言优劣的评选标准2、我对不同编程语言的优点与缺点的拙见**1. Java****2. Python****3. JavaScript****4. C语言&#xff1a;****5. C语言&#xff1a;** 3、对python编程语言未来发展的猜测和未来趋势 我最喜…

Vicuna-13B使用云服务器部署

Vicuna概述 Vicuna由一群主要来自加州大学伯克利分校的研究人员推出&#xff0c;仍然是熟悉的配方、熟悉的味道。Vicuna同样是基于Meta开源的LLaMA大模型微调而来&#xff0c;它的训练数据是来自ShareGPT上的7万多条数据&#xff08;ShareGPT一个分享ChatGPT对话的谷歌插件&am…

kerberos配置dolphinscheduler

kerberos配置dolphinscheduler 一、添加dolphin 用戶1.所有節點上執行如下命令&#xff1a; 二、DolphinScheduler集群模式部署1.集群规划2.前置准备工作3.解压DolphinScheduler安装包4. 创建元数据库及用户5. 配置一键部署脚本6 初始化数据库7.修改common配置文件8. 一键部署D…

华为、思科和瞻博网络三个厂商如何配置基本ACL和高级ACL?

今天给大家带来基本ACL和高级ACL的配置&#xff0c;主要会介绍三个厂商的配置&#xff1a; 其他厂商也可以参考&#xff0c;比如华三的可以参考华为的&#xff0c;锐捷的参考思科的。 1. 基本ACL配置 基本ACL&#xff08;Access Control List&#xff09;是一种简单的网络安全…

【Java高级语法】(十二)可变参数:Java中的“可变之美“,做好这些细节,你的程序强大又灵活~

Java高级语法详解之可变参数 &#x1f539; 前言1️⃣ 概念2️⃣ 优势和缺点3️⃣ 特征和应用场景3.1 特征3.2 应用场景 4️⃣ 使用和原理5️⃣ 使用技巧5.1 可变参数结合泛型5.2 使用元组或列表进行参数传递5.3 使用默认值5.4 缓存计算结果 6️⃣ 实战&#xff1a;构建动态日志…