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

在这里插入图片描述


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

👨‍💻 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#专题篇】—核心章题单实践练习


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


在这里插入图片描述

ImGUI又称为Dear ImGui,它是与平台无关的C++轻量级跨平台图形界面库,没有任何第三方依赖,可以将ImGUI的源码直接加到项目中使用,也可以编译成dll, ImGUI使用DX或者OpenGL进行界面渲染,对于画面质量要求较高,例如客户端游戏,4k/8k视频播放时,用ImGUI是很好的选择,当然,你得非常熟悉DirectX或者OpenGL,不然就是宝剑在手,屠龙无力。相对于Qt、MFC、DuiLib、SOUI等,ImGUI的拓展性更好,也更轻量级,当然对于开发者的要求也更高.
————————————————
版权声明:本文为CSDN博主「秩沅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_64128218/article/details/131340771


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从0开始,手写MySQL事务

说在前面&#xff1a;从0开始&#xff0c;手写MySQL的学习价值 尼恩曾经指导过的一个7年经验小伙&#xff0c;凭借精通Mysql, 搞定月薪40K。 从0开始&#xff0c;手写一个MySQL的学习价值在于&#xff1a; 可以深入地理解MySQL的内部机制和原理&#xff0c;Mysql可谓是面试的…

大数据Doris(五十):Export导出原理

文章目录 Export导出原理 一、原理 二、查询计划拆分 三、查询计划执行 Export导出原理 Doris Export、Select Into Outfile、MySQL dump三种方式数据导出。用户可以根据自己的需求导出数据。此外数据还可以以文件形式通过Borker备份到远端存储系统中&#xff0c;之后可以…

idea打的包字符集为GBK

1.最近对接一个打印机厂家的机器&#xff0c;他们对与打印数据要求字符集是UTF-8的&#xff0c;做完程序在自己idea上运行是是能够打印的&#xff0c;但是打包后&#xff0c;就不能够打印了。然后问了设备方是否是他们机器的原因&#xff0c;后面他们问了我这报错码&#xff0c…

【单片机】STM32单片机的各个定时器的定时中断程序,标准库

文章目录 定时器1_定时中断定时器2_定时中断定时器3_定时中断定时器4_定时中断定时器5_定时中断 高级定时器和普通定时器的区别&#xff08;https://zhuanlan.zhihu.com/p/557896041&#xff09;&#xff1a; 定时器1_定时中断 TIM1是高级定时器&#xff0c;使用的时钟总线是R…

Methodot低代码开发教程——玩转表格增删改查分页

目录 1、背景介绍 2、连接数据源 2.1 新增数据源 2.2 填写数据源信息 3、表格数据的展示 3.1 新增查询&#xff0c;编写查询语句 3.2 使用表格组件 3.3 同步数据源与表格列名 4、表格的数据新增 4.1 新增查询&#xff0c;编写新增语句 4.2 表格配置新增一行&#xff0…

探索嵌入式开发领域:单片机、ARM、Android底层的紧密联系

作为一个曾编写ARM教程和参与Android产品开发的专家&#xff0c;我发现单片机、ARM、嵌入式开发和Android底层开发之间存在紧密的联系。对于那些希望在嵌入式开发领域发展的人来说&#xff0c;了解这些领域的知识至关重要。为了帮助你更好地学习这些内容&#xff0c;我总结了一…

Git指南 - 刚提的commit 怎么找不到了(游离分支)?

在有一次使用git时&#xff0c;我提交commit后&#xff0c;并未push&#xff0c;然后直接切到了当前分支的某个tag&#xff0c;最后我想切回来的时候&#xff0c;竟然找不到我刚才提交commit的节点了… 关联篇 Git指南 - 你该掌握的那些基础认知和首次配置Git指南 - 项目实战中…

青大数据结构【2018】【综合应用】

关键字&#xff1a; 二叉排序树、先序中序排列、平均查找长度ASL、快速排序、堆排序 &#xff08;3&#xff09; 采用堆排序&#xff1b; 因为快速排序在基本有序&#xff08;逆序&#xff09;的情况下&#xff0c;达到最坏的时间复杂度O(n2)。

如何支持研发对CSDN个性化推荐系统重构

目录 大地图工具构建数据治理保持发布重视测试小结引用 一个以内容服务为主的软件&#xff0c;它的推荐系统在数据侧对软件产生着举足轻重的作用。数据的三个方面决定了这个内容软件的档次。 数据的质量好坏数据和用户需求的相关性好坏数据的层次体系好坏 通常&#xff0c;我…

如何使用ChatGPT处理excel

用ChatGPT处理excel&#xff0c;我们需要用到的主要工具是ChatGPT和vba代码。 VBA代码是一种用于Excel&#xff0c;Word&#xff0c;PPT的Microsoft Office软件的编程语言。 可以让用户通过编写一些简单的指令和操作&#xff0c;实现自动化、自定义和数据处理等功能。 就像你编…

2023亚马逊云科技中国峰会之Serverless

序言 Amazon Web Services&#xff0c;是Amazon.com推出的一系列云计算服务。 它提供了一系列的基础设施服务、平台服务和软件服务&#xff0c;希望可以帮助我们更轻松地构建和管理基于云的应用程序。 今天来学习一下 Serverless 本文会介绍以下六个模块&#xff1a; 为什么会…

如何画时序图

10年产品经理教你3步画好UML时序图&#xff0c;轻松掌握流程分析利器【建议收藏】 - 知乎 转自知乎 上次介绍了活动图&#xff0c;这次分享 UML 中&#xff0c;另一种流程分析利器——时序图。 以前每次要分析流程&#xff0c;我都会用活动图。直到有一次&#xff0c;我面对…

使用VuePress生成静态网站并部署到github

目录 第一步 安装VuePress第二步 书写博客第二步 部署到github 第一步 安装VuePress VuePress是一个基于Vue驱动的静态网站生成器 相关资料 文档&#xff1a;https://v1.vuepress.vuejs.org/zh/github: https://github.com/vuejs/vuepressvuepress-deploy: https://github.c…

什么是RabbitMQ?

RabbitMQ是一个由erlang开发的消息队列。消息队列用于应用间的异步协作。 2.RabbitMQ的组件 Message&#xff1a;由消息头和消息体组成。消息体是不透明的&#xff0c;而消息头则由一系列的可选属性组成&#xff0c;这些属性包括routing-key、priority、delivery-mode&#xff…

NoSQL之 Redis 配置与优化

目录 一、关系型数据库与非关系型数据库1.1 关系型数据库&#xff1a;1.2 非关系型数据库1.3 关系型数据库和非关系数据库的区别1.3.1 数据存储方式不同1.3.2 扩展方式不同1.3.3 对事务性的支持不同 1.4 非关系型数据库的产生背景1.5 总结 二、Redis介绍三、 Redis 的优点四、 …

【金融量化】如何筛选基金?

基金的评价与筛选 1 筛选步骤 1.1 股票型基金 &#xff08;1&#xff09;构建备选池 优先考虑股票配置较为稳定的基金&#xff0c;这样才能预估基金未来一段时间的表现&#xff0c;及其对基准股票指数的跟踪情况。因此&#xff0c;首先应该剔除那些仓位变化较大、本身在进行…

Tableau 和 Qlikview哪个更好用?

Tableau 和 Qlikview 是市场上用于分析数据的两种重要的 BI 工具&#xff0c;并配备了广泛的可视化效果。本文将全面概述每个工具&#xff0c;以及基于业务、技术和可视化三个主要类别的基本差异。每个公司都希望用最好的BI工具来处理大量数据。在这篇文章中&#xff0c;我们将…

基于OpenCV-车辆检测项目(简易版)

车辆检测 1.项目介绍2. 读取一段视频3.通过形态学处理识别车辆4.描画轮廓5. 车辆计数并显示 本项目使用的视频地址链接 1.项目介绍 对一个视频进行车辆数量的检测&#xff0c;用到的知识有视频的读取&#xff0c;滤波器&#xff0c;形态学&#xff0c;添加直线、文本&#xff…

实战-基于Jenkins+K8s构建DevOps平台(九)

实验步骤如下&#xff1a; 第一部分&#xff1a;安装持久化存储nfs 1、在k8s-master和k8s-node1上安装nfs服务 [rootk8s-master ~]# yum install nfs-utils -y [rootk8s-master ~]# systemctl start nfs [rootk8s-master ~]# systemctl enable nfs [rootk8s-node1 ~]# yum …

Java 集合继承关系图

Java 容器类库的用途是“保存对象”&#xff0c;并划分为两大类,序列Collection和健值对 Map Collection接口&#xff1a;一个独立元素的序列&#xff0c;衍生的2个子类接口 List接口&#xff1a;存储有序的、可重复的数据 实现类: ArrayList、LinkedList、Vector Set接口&am…