4个版本

0.1.3 2022年1月27日
0.1.2 2022年1月27日
0.1.1 2022年1月27日
0.1.0 2022年1月27日

#1780游戏开发

MIT/Apache

340KB
4.5K SLoC

ui4

ui4是我为Bevy游戏引擎制作的第四个UI数据流库。更具体地说,它是一个无vdom的UI库,使用细粒度响应式来保持UI与游戏其他部分和自身的同步。

警告

这个库非常年轻且未经测试。请在自己的风险下尝试!

为什么要使用ui4

截至Bevy 0.6,Bevy中的UI可以变得非常繁琐。使用这个库编写的代码也是如此,但(希望)你会发现这个crate带来的繁琐程度会给你带来更大的便利 :)

更具体地说,这个库提供小部件抽象、响应性、动画和一系列内置小部件!

用法

use bevy::prelude::*;
use ui4::prelude::*;

fn main() {
    let mut app = App::new();
    app.add_plugins(DefaultPlugins)
        .add_plugin(Ui4Plugin)
        .add_plugin(Ui4Root(root));

    app.run()
}

fn root(ctx: Ctx) -> Ctx {
    #[derive(Component)]
    struct State(i32);

    let state = ctx.component();
    let this = ctx.current_entity();

    ctx.with(State(0))
        .with(Top(Units::Pixels(50.)))
        .with(Left(Units::Pixels(50.)))
        .child(text("Hello!").with(Height(Units::Pixels(30.))))
        .child(|ctx| {
            ctx.with(Width(Units::Pixels(300.)))
                .with(Height(Units::Pixels(30.)))
                .with(LayoutType::Row)
                .child(button("Increment").with(OnClick::new(move |world| {
                    world.get_mut::<State>(this).unwrap().0 += 1;
                })))
                .child(button("Decrement").with(OnClick::new(move |world| {
                    world.get_mut::<State>(this).unwrap().0 -= 1;
                })))
                .child(text(
                    state.map(|s: &State| format!("The number is {}", s.0)),
                ))
        })
}

有关如何使用此库的更多示例,请参阅示例文件夹,还可以考虑查看docs.rs上的教程模块

重要提示:此crate使用装箱绕过稳定Rust的一些限制,因此切换到nightly并启用nightly功能可能会提高性能,并建议这样做。

帮助

有关使用此库的帮助,请随时在Bevy Discord上联系@TheRawMeatball#9628。我相当活跃,所以如果你有疑问,请随时提出!如果你发现了一个错误,github issue将会受到欢迎 :)

依赖关系

~62MB
~1M SLoC