关于 bevy-ui
面向游戏 UI 开发者的 Bevy 0.19 界面构建参考 Skill。内容涵盖布局、交互、文本样式、焦点管理、无障碍标签,以及静态或动态子节点树。
主要功能
- 01构建基于 Node 的 UI 布局
- 02处理按钮交互状态
- 03使用 0.19 API 设置文本样式
- 04管理输入焦点和无障碍名称
- 05创建静态或动态子节点树
适用场景
- 01实现菜单、面板和覆盖层
- 02设置 Bevy 0.19 界面的文本样式
- 03添加键盘焦点和无障碍标签
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ chrisgliddon/ bevy-skills --skill bevy-ui安装后在 Claude Code 中输入/bevy-ui确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/accessibility.mdchildren-macro.mdcolors-and-borders.mdgotchas.mdinteraction.mdlayout.mdpalettes.mdtext.md详细介绍
Bevy 0.19 — UI
何时使用此技能
- 创建基于
Node的面板、按钮、标签、叠加层或菜单。 - 处理
Interaction::{None, Hovered, Pressed}和视觉状态。 - 适配 0.19 Parley 迁移后的文本样式。
- 管理通过指针获取的
InputFocus或可访问名称。 - 使用
children![]构建静态树,或使用with_children构建动态树。
标准模式
use bevy::{
input_focus::{FocusCause, InputFocus},
prelude::*,
};
fn main() {
App::new()
.add_plugins(DefaultPlugins) // includes InputFocusPlugin in 0.19
.add_systems(Startup, setup)
.add_systems(Update, style_button)
.run();
}
fn setup(mut commands: Commands, assets: Res<AssetServer>) {
commands.spawn(Camera2d);
commands.spawn((
Node {
width: percent(100),
height: percent(100),
align_items: AlignItems::Center,
justify_content: JustifyContent::Center,
..default()
},
children![(
Button,
AccessibleLabel::new("Start game"),
Node {
width: px(180),
height: px(64),
border: UiRect::all(px(3)),
border_radius: BorderRadius::MAX,
align_items: AlignItems::Center,
justify_content: JustifyContent::Center,
..default()
},
BackgroundColor(Color::srgb(0.12, 0.12, 0.15)),
BorderColor::all(Color::WHITE),
children![(
Text::new("Start game"),
TextFont {
font: assets.load("fonts/FiraSans-Bold.ttf").into(),
font_size: FontSize::Px(32.0),
..default()
},
TextColor(Color::WHITE),
)],
)],
));
}
fn style_button(
mut focus: ResMut<InputFocus>,
mut buttons: Query<
(Entity, &Interaction, &mut BackgroundColor),
(Changed<Interaction>, With<Button>),
>,
) {
for (entity, interaction, mut background) in &mut buttons {
*background = match interaction {
Interaction::Pressed => {
focus.set(entity, FocusCause::Pressed);
BackgroundColor(Color::srgb(0.15, 0.55, 0.25))
}
Interaction::Hovered => BackgroundColor(Color::srgb(0.22, 0.22, 0.28)),
Interaction::None => BackgroundColor(Color::srgb(0.12, 0.12, 0.15)),
};
}
}
主题
| 主题 | 参考 |
|---|---|
Node、Val、flex/grid 布局 | 布局 |
FontSource、FontSize、TextLayout | 文本 |
Button、Interaction、Changed | 交互 |
| 颜色、边框和圆角 | 颜色和边框 |
| 调色板常量 | 调色板 |
InputFocus、语义、可访问标签 | 无障碍 |
| 静态和动态子项 | 子项 |
| 常见问题 | 易错点 |
易错点
- 新插入的组件会满足
Changed<T>。交互系统通常会在首次Update时处理新按钮;当需要区分插入和后续修改时,请使用Ref<T>::is_added()。 - 指针悬停和输入焦点并不相同。请勿仅因光标移入或移出,就移动或清除键盘/辅助技术焦点。
TextFont.font的类型是FontSource;使用.into()转换Handle<Font>。font_size的类型是FontSize,例如FontSize::Px(32.0)。InputFocus的字段是私有的。请使用get、set(entity, FocusCause)和clear。DefaultPlugins会对其进行初始化。- 可见的文本子项会为
Button提供推断名称,但如果可见文本不存在、仅用于装饰或含义模糊,请使用AccessibleLabel。
另请参阅
bevy-a11y— 完整的游戏无障碍实现。bevy-fluent— 本地化 UI 文本。bevy-cameras— UI 摄像机和渲染目标。bevy-ecs-queries— 变更检测。
评论
支持 Markdown