大家好,我最近一直在使用 Unity 的 UI Toolkit,经常遇到令人沮丧的限制,尤其是缺乏 native 的 gap 属性和绘制倾斜/扭曲形状的困难。为了解决这个问题,我创建了 Playsmart UI Toolkit Extensions,这是一个开源库,添加了这些布局工具和自定义组件到你的项目中。
仓库链接:github.com/Drwuu/playsmart-unity-uitoolkit-extensions
OpenUPM 链接:openupm.com/packages/com.playsmart.uitoolkit-extensions/(或通过 Git URL 安装)
关键特性
1. (模拟 Flexbox Gap)
Unity USS 没有 native 支持 gap。如果你写入它,你会得到未知属性警告。这元素读取一个自定义 --gap 属性,并动态处理布局间距。
- Flex-Direction Aware:自动检测父容器的方向(Row、Column、RowReverse、ColumnReverse)并应用正确的边距。
- Display-Aware Spacing:如果子元素有
display: none(例如过滤列表项),间距管理器会忽略它并重置边距,以避免双重间距或空白边距块。 - Clean Margins:自动清除最后一个可见子元素的间距,以防止布局偏移错误。
2. & (倾斜容器和按钮)
标准 CSS transform: skewX 倾斜子元素,需要在标签上写入反倾斜的hack以保持它们的直立状态。
- 直立内部:组件使用
MeshGenerationContext绘制一个倾斜的向量背景,同时保持所有文本和子元素的直立状态和清晰度。 - 倾斜点击测试:覆盖
ContainsPoint方法,使用三角函数进行边界检查。点击仅在鼠标位于倾斜形状内部时才会注册,匹配正负角度的可视几何形状。 - 清晰的边界:包含形状在布局盒的边界内,以防止视觉溢出和剪裁在父元素中。
快速示例
使用 Gap 在 UXML 和 USS 中
xml
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:ps="Playsmart.UIToolkit">
<ps:Gap class="flex-row-container">
<ui:VisualElement class="box" />
<ui:VisualElement class="box" />
<ui:VisualElement class="box" />
</ps:Gap>
</ui:UXML>
css
.flex-row-container {
flex-direction: row;
--gap: 20; /* 动态间距子元素 20px */
}
使用 SkewButton 在 UXML 和 USS 中
xml
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:ps="Playsmart.UIToolkit">
<ps:SkewButton name="ConfirmButton" text="START GAME" class="slanted-btn"/>
</ui:UXML>
css
.slanted-btn {
width: 150px;
height: 45px;
--skew-angle: 15; /* 倾斜背景 15 度 */
--skew-fill-color: #1e1e32;
--skew-stroke-color: #00f0ff;
--skew-stroke-width: 1.5;
}
开放贡献!
我的目标是不断扩展这个包成为一个完整的 UI Toolkit 缺失布局和样式扩展库。如果你解决了其他 USS/UXML 问题或想添加组件,请自由打开一个问题或提交一个 Pull Request!
https://preview.redd.it/pggiqbjz3tdh1.png?width=1917&format=png&auto=webp&s=5dd609bc20ee5ac66f22e41a1b5ad28f31de322a
评论 (0)