Unity EditorStyles3 个让扩展看起来像原生的写法【免费下载链接】UnityCsReferenceUnity C# reference source code.项目地址: https://gitcode.com/gh_mirrors/un/UnityCsReference给 Inspector 扩展加了一个工具栏按钮被同事指出和原生工具栏“明显不是一家人”——边框、底色、hover 反馈全都不对。手写 GUIStyle 自定义样式更麻烦深浅两套皮肤颜色各不相同改好一边另一边又坏。问题其实就两个Unity EditorStyles 的内置样式是怎么维护的以及不同项目规模该选哪种落地模式。EditorStyles 的真实维护方式一次 GetStyle 加一层皮肤缓存所有公开属性的源头在 EditorStyles.cs600 来行、一百多种样式。挑 5 个代表性的字段看label对应 ControlLabel是 EditorGUI 各控件的 prefix label最基础的文本样式miniButton对应 miniButton配套的miniButtonLeft/miniButtonMid/miniButtonRight用于把一排按钮连成横向组toolbar和toolbarButton分别对应 toolbar 与 toolbarbutton前者是窗口顶部工具栏的底色后者是它上面的按钮helpBox对应 HelpBox信息提示区块的背景源码里额外开了imageIsTopAligned对齐 UIToolkit 版本inspectorDefaultMargins不来自皮肤文件是纯代码构造的padding RectOffset(18, 4, 4, 0)其中 18 来自kInspectorPaddingLeft 8 10这个常量。初始化逻辑在UpdateSkinCache。先看s_CachedStyles[skinIndex]两个槽位为空时才刷新皮肤资源并实例化s_CachedStyles[skinIndex] new EditorStyles(); s_CachedStyles[skinIndex].InitSharedStyles(); s_Current s_CachedStyles[skinIndex];每个m_xxx字段都在InitSharedStyles里一次性填充靠GetStyle(styleName)取值先查当前GUI.skin再回退到EditorGUIUtility.GetBuiltinSkin(EditorSkin.Inspector)仍找不到就打 Missing built-in guistyle 并返回GUISkin.error。有两个细节值得记住。其一并非全部来自皮肤文件m_TextArea new GUIStyle(m_TextField) { wordWrap true }m_CenteredGreyMiniLabel是把 normal / hover / active / focused 四个状态全改成灰色。所谓派生样式其实就是在基样式上改一两个参数写 GUIStyle 自定义样式时照抄内置再调参比从零开始稳定得多。其二皮肤切换就是s_Current s_CachedStyles[skinIndex]这一行用户在编辑器里换 Pro / 个人版皮肤后读到的每个属性都会自动换成新皮肤的一套不需要任何额外处理 三种落地模式按项目规模选对姿势纯代码 GUIStyle一次性 UI 的最快路径一次性的 UI 小块直接复制内置样式改参数static readonly GUIStyle SectionTitle BuildSectionTitle(); static GUIStyle BuildSectionTitle() { var s new GUIStyle(EditorStyles.boldLabel); s.fontSize 2; s.margin new RectOffset(8, 8, 4, 2); return s; }适用边界一次性的 UI 小块Inspector 扩展样式场景最常见必须缓存成静态字段不能在 OnGUI 里每次 new。USS 样式表多窗口项目的集中管理一个项目里有多个窗口时样式代码散落在各 C# 文件里很难维护把规则挪进 .uss 文件由窗口根节点引用。SceneView.cs 的写法是现成模板root.AddStyleSheetPath(StyleSheets/MyWindowCommon.uss); root.AddStyleSheetPath(EditorGUIUtility.isProSkin ? StyleSheets/MyWindowDark.uss : StyleSheets/MyWindowLight.uss);适用边界基于 UIElements 的窗口、多窗口项目公共规则放 Common 一份Dark / Light 拆两份跟皮肤走。isProSkin 分支Editor 皮肤切换的标准写法IMGUI 路径下皮肤切换的判断点就是EditorGUIUtility.isProSkin源码里即skinIndex 1GUIStyle BuildWarnLabel() { var s new GUIStyle(EditorStyles.label); s.normal.textColor EditorGUIUtility.isProSkin ? new Color(0.9f, 0.85f, 0.4f) : new Color(0.6f, 0.45f, 0f); return s; }适用边界颜色确实随皮肤变化时才分支别给每个 label 都写一份样式来自EditorStyles.*时框架已经处理了切换不用手动分支。踩坑与下一步1. 切完深浅色皮肤自定义样式颜色纹丝不动现象用户切换皮肤后扩展里的手写样式颜色不变。原因启动时把样式从 EditorStyles 复制进了静态字段皮肤切换只换s_Current旧拷贝不会动。解法在皮肤切换的合适时机重新取基样式重建或者调用处直接用EditorStyles.*把切换交给框架。2. 控制台出现 Missing built-in guistyle现象运行日志里报缺失内置样式。原因GetStyle先查GUI.skin在 play 模式或错误上下文里当前皮肤不是编辑器皮肤内置样式名找不到。解法确认代码运行在编辑器上下文确需取内置样式时用EditorGUIUtility.GetBuiltinSkin(EditorSkin.Inspector)。3. 自定义控件多的窗口偶发卡顿现象窗口里自定义控件一多帧时间抖动。原因OnGUI 里每帧new GUIStyle复制样式、赋字段都是每帧分配。解法样式缓存进静态字段只在皮肤切换后重建s_CachedStyles的双槽缓存就是这个思路。下一步是把扩展用到的 Unity Editor Styles 属性列一张清单标出哪些来自皮肤、哪些是代码构造的再挑最头疼的几个先改成 USS 规则。【免费下载链接】UnityCsReferenceUnity C# reference source code.项目地址: https://gitcode.com/gh_mirrors/un/UnityCsReference创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?