Widget Reflector:抄 UE5 自己的编辑器界面
过程生成的状态一直只活在 log 里。
生成到哪一步了、cache 命中没有、这一次的量级多大、内存吃了多少 —— 想看一眼,要翻半天输出。
所以前几天晚上 11 点开始 coding,写了一个 EditorTab,专门做 generation 的监视器,特别是编辑器里的生成。把这几个数字放上去之后,状态跃然纸上。
当然,第一版的 Slate layout 非常丑,只是把 progress 绑上去了而已。
先说 Slate 的心智模型
从写法上看,Slate 很容易让人想到 imgui:界面结构直接写在代码里,状态用 lambda 拉,不用手写一堆 setter 去同步。
但它并不是每帧重建控件树。TAttribute 只是把”取值”这件事延后到需要的时候,控件本身是留着的。
理解这一点之后写起来就顺了:不要去想”什么时候该刷新 UI”,只要保证绑上去的那个 lambda 任何时候都能取到当前值。监视面板这种全是只读数字的界面,这个模型几乎是白送的。
转折是 Widget Reflector
丑的问题卡了我一会儿。
我看到新版 content browser 的 round button 效果很赞,字体也更圆润,就想把自己的面板也套上这套风格。问题是我不知道它叫什么 —— UE 的编辑器有一整套现成的 style set,但你没法凭空猜出某个好看的东西对应哪个 style 名字。
Widget Reflector 正好把这个查表过程消掉了。它非常神器:能把每一个 widget 的创建代码行反射出来。
在界面上选中那个按钮,直接跳到源码那一行,看它用了什么 brush、什么 style、什么字体,再回到自己的代码里照着写。一目了然。
因此很快就套用出了这一套非常赞的新视觉设计。
真正的收获不是”我做了个好看的面板”,而是:UE 编辑器 UI 的难点从来不是没有好东西,是不知道好东西叫什么名字。 Widget Reflector 是那本目录。
下一步
接下来准备规范一下面板文件的存放,然后把对应的一些 monitor 功能接入,就可以关掉这个 feature 分支了。
再往后是最大的那个计划 —— 融合 htrae 项目。
边界
我还没有形成 Slate 的最佳实践,目前只是能用、能看。
面板数量一多,style 引用和布局代码会怎么膨胀,我完全没有验证过。现在这套写法在一个面板上成立,不代表在十个面板上还成立。