IMGUI的自适应缩放

IMGUI的自适应缩放

最近有个很怪的需求 要对GUI写的debug窗口做4K分辨率的适配

我虽然很想吐槽 明明是个发布后不会实际用到的东西

为啥还要特意做适配呢

但是没办法 就开搞吧


我一开始并不知道能够做等比例缩放

所以我用的方法是做新的GUI style

里面赋值的数据乘上算好的缩放系数

但是这样bug很多

特别是对于索引式的按钮列表

传进去一个string数组和每行显示的个数

就会自动生成一排能返回索引的按钮列表

通过这个再和委托什么的关联就可以实现按钮点击事件了

这样单纯替换GUI style你还得手写一个功能实现

总之这么搞很不划算 昨天一提主干马上就炸了 很难受


今天上午回来整了整 终于搞清楚了矩阵缩放要怎么搞

首先我们先明确一下需求

因为Unity的Game窗口是有很多种分辨率的

平时策划用习惯的都是在Free Aspect下的窗口

也就是一般小于标准1920*1080的大小

所以我打算不对小于标准的做缩放 这样策划那看到的还是原来的大小

然后以1920*1080也就是2k为基准

GUISkin cachedGuiSkin = GUI.skin;
Matrix4x4 cachedMatrix = GUI.matrix;

//在大于1920 1080的情况下再进行矩阵缩放
if (Screen.width >= 1920 && Screen.height >= 1080)
{
Vector3 vector1 = Vector3.zero;

Quaternion vector2 = Quaternion.identity;

//按照当前屏幕的比例进行缩放
Vector3 vector3 = Vector3.zero;
vector3.x = Screen.width / 1920f;
vector3.y = Screen.height / 1080f;
vector3.z = 1;

Matrix4x4 temp = Matrix4x4.identity;
//设置矩阵缩放
temp.SetTRS(vector1, vector2, vector3);

GUI.matrix = temp;
}
//width和height 画布的大小要写死 
//如果前面没有写死这边也要写死
m_WindowRect.width = 1072;
m_WindowRect.height = 480;

GUI.skin = m_Skin;
//绘制画布
m_WindowRect = GUILayout.Window(0, m_WindowRect, DrawWindow, "<b>GAME FRAMEWORK DEBUGGER</b>");

//还原缩放
GUI.matrix = cachedMatrix;
GUI.skin = cachedGuiSkin;

位置默认是左上角 所以我没有修改 如果需要可以改Vector1的值

然后要注意的是 画布一定是写死宽高的 否则缩放就要变形了

然后绘制画布看看效果 4k下和2k下的大小是一样的 总算搞定了

 

 

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注