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 在 游戏开发
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