👨💻个人主页:@元宇宙-秩沅
👨💻 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