【Unity之IMGUI】—自定义常用控件的封装(即拿即用)

news2024/11/17 21:22:11

在这里插入图片描述


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

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

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏:UnityUI篇实战

🅰️IMGUI封装实践【三】



文章目录

    • 🅰️IMGUI封装实践【三】
    • 前言
    • 🎶(==A==) 控件创建及其封装——标签
    • 🎶(==B==) 控件创建及其封装——按钮
    • 🎶(==C==) 控件创建及其封装——多选框
    • 🎶(==D==) 控件创建及其封装——单选框
    • 🅰️


前言

在这里插入图片描述


🎶(A 控件创建及其封装——标签


在这里插入图片描述
在这里插入图片描述

  • UML类图在这里插入图片描述

  • 封装代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能:  标签的创建
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class Label : ControlFather 
{
   

    protected override void OffDrawStyle()
    {
        GUI.Label(ContorlPosition.LastPos ,ContorlContent );
    }

    protected override void OnDrawstyle()
    {
        GUI.Label(ContorlPosition.LastPos, ContorlContent ,ContorlStyle);
    }
}


🎶(B 控件创建及其封装——按钮


在这里插入图片描述
在这里插入图片描述

  • 按钮封装代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 创建按钮
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class Button : ControlFather
{
    public event  UnityAction triggerEvent; 
                                            //事件的添加在此起到妙用
                                            //只要在外部给予响应函数                

    protected override void OffDrawStyle()
    {
        if(GUI.Button(ContorlPosition.LastPos ,ContorlContent))
        {
            triggerEvent?.Invoke();
        }
    }

    protected override void OnDrawstyle()
    {
       if(GUI.Button(ContorlPosition.LastPos, ContorlContent,ContorlStyle ) )
        {
           triggerEvent?.Invoke();
        }
    }
}


🎶(C 控件创建及其封装——多选框


在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 封装代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 多选框功能的封装
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class ToggleM : ControlFather
{
    public  bool IsSwitch;
    private bool previousSwitch;
    public event UnityAction<bool> triggerEvent;

    protected override void OffDrawStyle()
    {
      IsSwitch = GUI.Toggle(ContorlPosition.LastPos, IsSwitch, ContorlContent);

      if(IsSwitch != previousSwitch )  //当上次开关状态 和 本次开关状态不一样时
        {
            triggerEvent?.Invoke( IsSwitch );
            previousSwitch = IsSwitch; //更新上一次的开关状态
        }
    }

    protected override void OnDrawstyle()
    {
        IsSwitch = GUI.Toggle(ContorlPosition.LastPos, IsSwitch, ContorlContent,ContorlStyle );
        if (IsSwitch != previousSwitch)  
        {
            triggerEvent?.Invoke(IsSwitch);
            previousSwitch = IsSwitch;  
        }
    }
}


🎶(D 控件创建及其封装——单选框


在这里插入图片描述
在这里插入图片描述

  • UML类图
    在这里插入图片描述

  • 封装代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:    
//___________功能: 单选框功能的创建
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------

[ExecuteAlways ]
public class ToggleS : MonoBehaviour
{
    public ToggleM[] toggles;

    private ToggleM previousToggle;

    //此时只需放在start里面,而不需要放在持续帧的生命周期里的原因是,将方法放进事件中只需一次
    void Start()
    {
        if (toggles.Length == 0) return;

        foreach (ToggleM item1 in toggles )
        {
            item1.triggerEvent += (swtich) =>
            {
                //如果传入的开关是开的,那么其他全部都设为关
                if(swtich) 
                {
                    foreach (ToggleM item2 in toggles)
                    {
                        item2.IsSwitch = item2 != item1 ? false : true ;
                    }
                    previousToggle = item1;
                }
                //如果当前是开的其他全部是关的,就不允许它变成关(保证至少有一个开启)
                else if(item1 == previousToggle )
                {
                    item1.IsSwitch = true;
                }
            };

          
        }
        

        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

🅰️

在这里插入图片描述

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

在这里插入图片描述


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

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

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

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

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

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

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


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


在这里插入图片描述


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

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

相关文章

为什么有了HTTP,还需要WebSocket协议?

目录 WebSocket是什么&#xff1f; WebSocket怎样建立连接&#xff1f; WebSocket的实际用途 WebSocket 与 HTTP 的选择 HTTP是基于TCP协议的&#xff0c;同一时间里&#xff0c;客户端和服务器只能有一方主动发数据&#xff0c;是半双工通信。 通常&#xff0c;打开某个网…

基于Java海鲜自助餐厅系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

【Syncfusion系列】开篇简介

背景 准备开个新坑&#xff0c;分享下Syncfusion&#xff08;UI框架&#xff09;的使用&#xff0c;之前用的handycontry&#xff0c;目前是两者结合起来用。Syncfusion真的是非常的强大&#xff0c;我必须记录一下。 Syncfusion 简介 Syncfusion 是一家软件公司&#xff0c;专…

华为手机内存不足?别焦虑,这里有迁移数据的超实用技巧!

1、usb线缆连接电脑和手机。 2、使用C:\Program Files (x86)\HiSuite\HiSuite.exe工具导出照片和视频。 步骤1&#xff1a;下载和安装HiSuite.exe工具 前往华为官网下载并安装HiSuite.exe工具。安装完成后&#xff0c;通过USB线将你的华为手机连接到电脑上。 步骤2&#xff…

centos 安装elasticsearch8.7.0, 并设置密码访问

访问下载网站 Elasticsearch 8.7.0 | Elastic 进入centos , 创建目录es mkdir /opt/es cd /opt/es wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.7.0-linux-x86_64.tar.gz 3、解压目录 es870 tar -zxvf elasticsearch-8.7.0-linux-x86_64.tar…

NFC CE运行模式

NFC CE运行模式使得携带NFC芯片的设备能充当智能卡&#xff08;例如信用卡&#xff09;使用。该运行模式所支持的应用场景极具吸引力&#xff0c;例如用支持该功能的Android智能手机来完成购票、支付&#xff0c;甚至充当门禁卡&#xff0c;汽车钥匙、公交卡等。 图8-19为CE运…

如何使用SQL语句创建触发器

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

MySQL的版本从5.7跳到了8.0有哪些原因?

MySQL的版本从5.7跳到了8.0的原因&#xff1f; 一、引言1.1、MySQL是什么&#xff1f;1.2、MySQL 5.7和8.0的历史背景 二、MySQL 8.0的新功能2.1、更好的安全性2.2、更高的性能2.3、更好的可扩展性2.4、JSON支持 三、MySQL 8.0的重要改进3.1、更严格的数据类型检查3.2、其他重要…

第三章 处理机调度

目录 一、调度的概念、层次 2.1 调度的基本概念 2.2 调度的三个层次 2.2.1 高级调度 2.2.2 低级调度 2.2.3 中级调度 2.2.3.1 进程的挂起态 2.2.4 三层调度的联系、对比 二、进程调度的时机、切换与过程、方式 2.1 进程调度的时机 2.2 进程调度的方式 2.2.1 非抢占…

MFC的main函数

-- 我们走得太远&#xff0c;忘掉了来时路。 MFC程序的main在哪里&#xff1f; MFC的main是_tWinMain&#xff08;&#xff09;&#xff0c;有的版本是WinMain&#xff08;&#xff09;&#xff0c;AfxWinMain&#xff08;&#xff09;&#xff0c;总之会有Main字样。 作为C/C…

【Spring】Spring有什么用?Spring核心与设计思想之IOC与DI

文章目录 1 何为 Spring&#xff1f;2 什么是容器&#xff1f;3 理解Spring的 IOC3.1 传统开发的缺陷3.2 基于 IOC 思想的开发3.3 再谈Spring中的 IOC 4 理解Spring中的 DI写在最后 1 何为 Spring&#xff1f; Spring是一个开源的、轻量级的、面向企业级的Java应用框架。它提供…

(秋招)vins中的光流法

vins中的光流法 说到光流法&#xff0c;首先介绍其假设条件&#xff1a; 1.亮度恒定&#xff0c;就是同一点随着时间的变化&#xff0c;其亮度不会发生改变。这是基本光流法的假定&#xff08;所有光流法变种都必须满足&#xff09;&#xff0c;用于得到光流法基本方程。就是…

【CSS3系列】第七章 · 过渡和动画

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

可视化计算机科学论文库DBLP,高效整理文献,生成领域趋势图、词云图

Github项目链接&#xff1a;https://github.com/yaunsine/getDBLP Http克隆方式&#xff1a;git clone https://github.com/yaunsine/getDBLP.git SSH克隆方式&#xff1a;git clone gitgithub.com:yaunsine/getDBLP.git 作者&#xff1a;yaunsine dblp网站相信大家都不陌生&am…

模拟电路系列文章-ADC驱动电路

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 模数转换器(Analog to Digital Convertor&#xff0c;ADC)将模拟量转变成数字量&#xff0c;是电学测量、控制领域—个极为重要的部件。 一个模拟电压信号&#xff0c;在进入A…

统信UOS系统开发笔记(六):提取在线安装软件后,提取其安装包,部署目标机使用离线软件包方式安装软件

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/131348876 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

数据库底层物理存储层 的管理方案

​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 数据库的物理存储层 简介 数据库的数据&#xff0c;在物理介质上…

【二叉树part04】| 110.平衡二叉树、257.二叉树的所以路径、404.左叶子之和

目录 ✿LeetCode110.平衡二叉树❀ ✿LeetCode257.二叉树的所有路径❀ ✿LeetCode404.左叶子之和❀ ✿LeetCode110.平衡二叉树❀ 链接&#xff1a;110.平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&…

Redis的数据类型及对应的数据结构(一)

Redis的数据类型和数据结构的对应关系 左边是 Redis 3.0版本的&#xff0c;也就是《Redis 设计与实现》这本书讲解的版本&#xff0c;右边是7.0,注意区别很大 数据类型包括&#xff1a;String、List、Hash、Set、ZSet 对应的底层数据结构入上图 String的应用场景 缓存对象 …

17.API Promise化 miniprogram-api-promise

目录 1 安装 2 配置 3 使用 1 安装 安装之后会在项目路径下出现这个目录&#xff0c;这个目录中又我们之前安装过的npm包 我们删除掉 miniprogram_npm 这个目录 然后点击构建 npm 构建之后就自动变成这样 2 配置 进入 app.js&#xff0c;然后写下面这些东西 3 使用