【Unity之IMGUI控件可视化及其封装

举报
Mango易创 发表于 2023/06/27 16:20:49 2023/06/27
【摘要】 👨‍💻个人主页:@元宇宙-秩沅👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!👨‍💻 本文由 秩沅 原创👨‍💻 收录于专栏:UnityUI篇实战 ⭐🅰️IMGUI封装实践【二】⭐@[TOC] ⭐前言⭐缺点1:无法在编译过程进行可视化调整缺点2:无法分辨率自适应 🎶(==A==) 封装可视化脚本控制基类此图可忽略UML类图性能优化代码完整代码:using S...

在这里插入图片描述


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

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

👨‍💻 本文由 秩沅 原创

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

🅰️IMGUI封装实践【二】



@[TOC]


前言

在这里插入图片描述

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

在这里插入图片描述


🎶(==A==) 封装可视化脚本控制基类


此图可忽略

在这里插入图片描述

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

  • 性能优化代码
    在这里插入图片描述

  • 完整代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 让所有组件都可视化编辑
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------

[ExecuteAlways] //关键特性
public class ShowAllContorlRoot : MonoBehaviour
{
    private ControlFather[] allContorls; //里氏替换原则,装所有子类

    private void Start()
    {
        allContorls = this.GetComponentsInChildren<ControlFather>();
    }
    private void OnGUI()
    {
        foreach (ControlFather  item in allContorls)
        {
            //1.表示没有运行时(编译时)也来获取,Start是点击运行时可以获取
            //2.避免了运行时重复执行该API。消耗性能
            if( !Application.isPlayer)
            {
                allContorls = this.GetComponentsInChildren<ControlFather>();
            }
            item.Judge();
        }
    }
}


🎶(==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;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 让所有组件都可视化编辑
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------

[ExecuteAlways] //关键特性
public class ShowAllContorlRoot : MonoBehaviour
{
    private ControlFather[] allContorls; //里氏替换原则,装所有子类

    private void Start()
    {
        allContorls = this.GetComponentsInChildren<ControlFather>();
    }
    private void OnGUI()
    {
        foreach (ControlFather  item in allContorls)
        {
            //1.表示没有运行时(编译时)也来获取,Start是点击运行时可以获取
            //2.避免了运行时重复执行该API。消耗性能
            if( !Application.isPlayer)
            {
                allContorls = this.GetComponentsInChildren<ControlFather>();
            }
            item.Judge();
        }
    }
}

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();
        }
    }
}

ImGUI又称为Dear ImGui,它是与平台无关的C++轻量级跨平台图形界面库,没有任何第三方依赖,可以将ImGUI的源码直接加到项目中使用,也可以编译成dll, ImGUI使用DX或者OpenGL进行界面渲染,对于画面质量要求较高,例如客户端游戏,4k/8k视频播放时,用ImGUI是很好的选择,当然,你得非常熟悉DirectX或者OpenGL,不然就是宝剑在手,屠龙无力。相对于Qt、MFC、DuiLib、SOUI等,ImGUI的拓展性更好,也更轻量级,当然对于开发者的要求也更高.

🅰️


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

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

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

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

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

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

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


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


在这里插入图片描述


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。