mcpField
B
bevy-ui

bevy-ui

github.com/chrisgliddon开发2687 次安装9 周前更新
代码仓库

关于 bevy-ui

面向游戏 UI 开发者的 Bevy 0.19 界面构建参考 Skill。内容涵盖布局、交互、文本样式、焦点管理、无障碍标签,以及静态或动态子节点树。

主要功能

  1. 01构建基于 Node 的 UI 布局
  2. 02处理按钮交互状态
  3. 03使用 0.19 API 设置文本样式
  4. 04管理输入焦点和无障碍名称
  5. 05创建静态或动态子节点树

适用场景

  1. 01实现菜单、面板和覆盖层
  2. 02设置 Bevy 0.19 界面的文本样式
  3. 03添加键盘焦点和无障碍标签

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/chrisgliddon/bevy-skills --skill bevy-ui

安装后在 Claude Code 中输入/bevy-ui确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
accessibility.md
children-macro.md
colors-and-borders.md
gotchas.md
interaction.md
layout.md
palettes.md
text.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。

另请参阅

评论

支持 Markdown