#bevy-ui #bevy #ui #macro #performance

bevy-ui-build-macros

一组宏,用于加速在bevy中定义UI的过程

8个版本 (5个破坏性更新)

0.6.1 2023年7月16日
0.6.0 2022年12月7日
0.5.0 2022年11月21日
0.4.0 2022年8月31日
0.1.0 2021年11月12日

#2335 in 游戏开发

Download history 79/week @ 2024-03-29 14/week @ 2024-04-05 1/week @ 2024-04-26 2/week @ 2024-05-03

每月65次下载

MIT/Apache

19KB
153

Bevy UI Build宏

❗ 此crate已过时,请勿使用 ❗

此crate不会收到任何更新,并且与bevy的新版本不兼容。

建议使用以下之一

一组宏,用于加速在bevy中定义UI的过程。

Bevy版本

我们没有指定依赖的bevy版本。原因主要是,我依赖于一个bevy的私人分支,并且每次都要对每个bevy库进行分支,以使它们与我的bevy分支兼容,这是一件非常麻烦的事情。

由于这个crate只是定义宏,所以其中没有编译代码。宏要正常工作,唯一的要求是依赖的几个bevy符号在宏调用的作用域内。我们明确使用的bevy符号是

  • bevy::ecs::system::Insert
  • bevy::math::{Rect::{self,all}, Size::new}
  • bevy::prelude::Parent
  • bevy::ui::{entity::NodeBundle,Style, Val::{Percent,Px}}

这些宏只是围绕在定义bevy UI时常用结构体周围的包装。

// unit! -- UNIT --
unit!(10 px); unit!(100 pct); 
// Equivalent to
Val::Px(10.0); Val::Percent(100.0);

// style! -- STYLE --
style! {
  flex_wrap: FlexWrap::Wrap,
  flex_basis: unit!(90 pct),
};
// Equivalent to
Style {
   flex_wrap: FlexWrap::Wrap,
   flex_basis: unit!(90 pct),
   ..Default::default()
};

// size! -- SIZE --
size!(100 pct, 90 pct); size!(90 px, 40 px);
// Equivalent to
Size::new(Val::Percent(100.0), Val::Percent(90.0));
Size::new(Val::Px(90.0), Val::Px(40.0));

// rect! -- RECT --
rect!(10 px); rect!(5 px, 0 px); rect!(100 pct, 10 pct, 50 pct, 0 pct);
// Equivalent to
Rect::all(Val::Px(10.0));
Rect {
    left: Val::Px(5.0),
    right: Val::Px(5.0),
    top: Val::Px(0.0),
    bottom: Val::Px(0.0),
};
Rect {
    left: Val::Percent(100.0),
    top: Val::Percent(10.0),
    right: Val::Percent(50.0),
    bottom: Val::Percent(0.0),
};

// build_ui! -- BUILD_UI --
build_ui! {
     #[cmd(commands)]
     vertical{size:size!(100 pct, 100 pct)}(
         horizontal{justify_content: FlexStart, flex_basis: unit!(10 pct)}(
             tab_square[;focus], tab_square[;focus], tab_square[;focus]
         ),
         column_box(
             column[;red](
                 vertical(select_square, select_square),
                 horizontal{flex_wrap: Wrap}[gray](
                     square[;focus], square[;focus], square[;focus], square[;focus],
                     square[;focus], square[;focus], square[;focus], square[;focus],
                     square[;focus], square[;focus], square[;focus], square[;focus]
                 ),
                 horizontal{flex_wrap: Wrap}[gray](
                     square[;focus], square[;focus], square[;focus], square[;focus],
                     square[;focus], square[;focus], square[;focus], square[;focus]
                 )
             )
         )
     )
}
// Equivalent to
commands.spawn_bundle(NodeBundle {
    style: Style { size: size!(100 pct, 100 pct), .. vertical.style },
    .. vertical
})
  .with_children(|cmds| {
    cmds.spawn_bundle(NodeBundle {
        style: Style {justify_content: FlexStart, flex_basis: unit!(10 pct), .. horizontal.style },
        .. horizontal
    })
      .with_children(|cmds| {
        cmds.spawn_bundle(tab_square).insert(focus);
        cmds.spawn_bundle(tab_square).insert(focus);
        cmds.spawn_bundle(tab_square).insert(focus);
      });
    cmds.spawn_bundle(column_box)
      .with_children(|cmds| {
        cmds.spawn_bundle(column).insert(red)
          .with_children(|cmds| {
            vertical.with_children(|cmds| {
              cmds.spawn_bundle(select_square);
              cmds.spawn_bundle(select_square);
            });
            cmds.spawn_bundle(NodeBundle {
                style: Style {flex_wrap: Wrap, ..horizontal.style},
                .. horizontal
            }).insert(gray)
              .with_children(|cmds| {
                for _ in 0..12 {
                  cmds.spawn_bundle(square).insert(focus);
                }
              });
            cmds.spawn_bundle(NodeBundle {
                style: Style {flex_wrap: Wrap, ..horizontal.style},
                .. horizontal
            }).insert(gray)
              .with_children(|cmds| {
                for _ in 0..8 {
                  cmds.spawn_bundle(square).insert(focus);
                }
              });
          });
      });
  });

变更日志

  • 0.6.1: (非破坏性) 添加弃用横幅。
  • 0.6.0: (非破坏性) 使四个参数的 rect! 变体的终端逗号变为可选。
  • 0.5.0: 支持Bevy 0.9
  • 0.4.0: 支持Bevy 0.8,使用 bevy::ui::Sizebevy::ui::UiRect 代替 math::Sizemath::Rect
  • 0.3.0
    • 现在在 build_ui 中可以以逗号结束子项列表
    • 添加了条件子元素。只需将您想要条件性添加的子元素包裹在 if 中,您可以在子元素列表中添加任意数量的 if。这同样支持 if else重要:由于 Rust 宏的限制,您需要将谓词放在括号中 if (谓词) { ... }
  • 0.2.1
    • unit! 添加了 undefinedauto 参数,这也适用于 size!rect! 的单元风格参数。
  • 0.2.0
    • 重大变更:现在 build_ui! 宏使用 [bundle;comp] 而不是方括号中仅包含组件的列表。这使得指定组件列表成为可能。然而,如果您只想指定附加组件,则需要将分号放在方括号的开头。[;like, this]

许可证

这很奇怪。由于这段代码实际上无法产生可分发二进制代码,我认为任何主流许可证都不适用。除此之外,我通常将小型库许可给 WTFPL。但我会做一个好的社区玩家,根据您的意愿,以 MIT 或 Apache 2.0 双许可。

版权 © Nicola Papale,请参阅 LICENSE 文件了解许可详情。

无运行时依赖