
I'm sorry, but "UIWeaver" appears to be an English term or phrase. Could you please provide a game t
实验性UI框架
查看大图UIWeaver
UIWeaver 是一个实验性的 Minecraft UI 框架,旨在通过可复用的布局组件来构建模组屏幕,而非手动定位每个控件。
目前仍处于原型阶段。当前的主要目标是让屏幕结构更容易组织、与服务器保持同步,并在出现布局错误时便于调试。
为何存在
Minecraft 屏幕很容易变得混乱。大量 UI 代码最终混合了渲染、槽位定位、按钮处理、同步数据包、提示文本以及硬编码坐标。
对于小型菜单来说这还能应付,但当屏幕包含标签页、库存、进度条、服务器操作或可调整大小的布局时,就会变得很棘手。
UIWeaver 试图通过将屏幕描述为组件树来让此流程更可靠:
ui.column()
.padding(8)
.gap(6)
.add(ui.label(Component.literal("Machine Dashboard")))
.add(ui.row()
.gap(4)
.add(ui.button(Component.literal("Start")).action("start"))
.add(ui.button(Component.literal("Stop")).action("stop"))
)
.add(ui.progressBar().bind("progress"));
布局会自动决定每个子组件的位置,无需手动计算每个 x 和 y 坐标。
组件
UIWeaver 包含了构建常见 Minecraft 模组屏幕所需的基本构建块:
column(列)row(行)grid(网格)tabs(标签页)scrollPanel(滚动面板)label(标签)button(按钮)toggle(开关)checkbox(复选框)slider(滑块)textInput(文本输入框)progressBar(进度条)energyBar(能量条)fluidBar(流体条)slotGrid(槽位网格)
目标不是完全隐藏 Minecraft 的 UI 系统。槽位、提示文本、GUI 缩放和服务器验证仍然重要。UIWeaver 旨在让这些部分更容易组织。
布局
容器负责处理间距和子控件放置:
ui.column().padding(8).gap(4)
ui.row().gap(8).fillWidth()
ui.grid(3, 3)
这能让大部分屏幕避免变成一长串手动计算的坐标。
服务器操作
按钮可以向服务器发送命名操作:
ui.button(Component.literal("Start"))
.id("btnStart")
.action("start");
服务器决定操作实际执行的内容以及是否允许执行。这避免了将机器逻辑或受信任的状态更改放在客户端。
同步状态
屏幕可以从 UIViewModel 读取值:
energy = 100
maxEnergy = 10000
working = false
progress = 42
进度条、标签、开关和其他控件可以使用这些值进行显示,而无需每个控件单独处理数据包。
调试工具
UIWeaver 拥有用于解决布局问题的调试覆盖层和检查器。
在以下情况时非常有用:
- 组件超出其父容器范围
- 非活跃标签页仍在被检查
- 重新布局后子组件边界未更新
- 槽位视觉效果与真实的 Minecraft
Slot位置不匹配 - 面板被裁剪或位置过高
覆盖层可以绘制可见的组件边界,而检查器可以显示类型、ID、大小、位置、可见性和同步值。
示例
一个基本的机器屏幕可以这样编写:
.root(ui.column().padding(10).gap(8).size(530, 340)
.add(ui.row().gap(8).fillWidth().height(28)
.add(ui.column().gap(2).grow().height(28)
.add(ui.label(Component.literal("UIWeaver Reactor"))
.id("title"))
.add(ui.label(Component.literal("Server driven test machine"))
.id("subtitle"))
)
.add(ui.button(Component.literal("Start"))
.id("btnStart")
.action("start")
.size(54, 20))
.add(ui.button(Component.literal("Stop"))
.id("btnStop")
.action("stop")
.size(54, 20))
)
.add(ui.row().gap(8).fillWidth().height(58)
.add(ui.energyBar()
.id("energyBar")
.bind("energy", "maxEnergy")
.size(12, 54))
.add(ui.column().gap(5).grow().height(58)
.add(ui.label(Component.literal("Main cycle")))
.add(ui.progressBar()
.id("mainProgress")
.fillWidth()
.height(12))
)
.add(ui.fluidBar()
.id("fluidReserve")
.size(12, 54))
)
.add(ui.tabs().id("mainTabs").fillWidth().grow()
.tab("Main", ui.column().padding(8).gap(6)
.add(ui.label(Component.literal("Machine State")))
.add(ui.toggle().id("statusToggle"))
)
.tab("Inv", ui.column().padding(8).gap(6)
.add(ui.slotGrid(3, 3)
.id("slots")
.bind("machineInv"))
)
.tab("Tune", ui.column().padding(8).gap(7)
.add(ui.slider(0, 100)
.id("speedSlider")
.value(40))
.add(ui.button(Component.literal("Apply tuning"))
.id("applyTuning"))
)
)
)
当前特性
- 组件树屏幕定义
- 行、列、网格、标签页和滚动面板
- 标签、按钮、开关、复选框、滑块和文本输入框
- 进度条、能量条和流体条
- 基本的库存槽位网格
- 同步的 ViewModel 值
- 命名服务器操作
- Forge 客户端渲染器集成
- 组件边界覆盖层
- UI 检查器(用于布局和状态调试)
当前限制
UIWeaver 仍处于早期阶段,因此某些部分尚不稳定。
槽位放置
渲染的槽位网格和真实的 Minecraft Slot 对象必须完全对齐。这是在框架用于更大规模库存前需要稳定化的最重要事项之一。
标签页
只有活跃的标签页应该渲染、接收输入并出现在常规检查中。非活跃标签页的内容需要更严格的处理,以免意外影响可见布局。
样式
样式系统仍然基础。面板、边框、悬停状态、激活状态、间距预设和可复用的主题已规划但尚未完成。
发展方向
长期目标是让 Minecraft 模组屏幕更容易构建,同时不失去对关键部分的控制。
UIWeaver 应帮助实现:
- 从更小的部分构建屏幕
- 尽可能避免硬编码的像素计算
- 保持客户端交互经过服务器验证
- 使布局错误更容易被发现
- 支持 Minecraft 特定的 UI 需求,如槽位、提示文本、GUI 缩放和同步数据
路线图
未来可能的工作:
- 样式和主题 API
- 可复用的面板/卡片组件
- 更强大的槽位绑定
- 标签感知的布局传递
- 动画支持
- 提示文本辅助工具
- 经过验证的表单输入
- 屏幕编辑器
- 拖放布局调试
- 可复用的屏幕模板
- Fabric 支持
- NeoForge 支持
项目状态
UIWeaver 是一个原型。它已经证明了基本方法:屏幕可以由包含布局、同步值、操作和调试工具的组件树构建。
接下来的重点是使标签页和库存槽位可靠,然后改进样式,使屏幕不仅功能完善,而且外观精良。
社区
加入 UIWeaver Discord 服务器进行讨论、反馈、开发更新和支持。
许可证
UIWeaver 采用 GNU Lesser General Public License v3.0 许可。
您可以在自己的模组中将 UIWeaver 作为库使用,包括闭源或商业项目,前提是对 UIWeaver 本身所做的修改保持 LGPL-3.0 许可证的可用性。
完整许可证文本见 LICENSE 文件。
正在加载版本记录…

正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。