9个版本 (5个破坏性更新)
0.5.1 | 2024年3月25日 |
---|---|
0.5.0 |
|
0.4.0 | 2023年11月5日 |
0.3.0 | 2023年7月10日 |
0.0.3 | 2022年10月18日 |
#88 in 游戏开发
每月197次下载
用于 3 crates
97KB
2K SLoC
bevy-trait-query
bevy游戏引擎特质查询的实现。
在开始使用此crate之前,您应该熟悉bevy: https://bevy.rust-lang.net.cn/.
Bevy版本 | Crate版本 |
---|---|
0.13 | 0.5 |
0.12 | 0.4 |
0.11 | 0.3 |
0.10 | 0.2 |
0.9 | 0.1 |
0.8 | 0.0.3 |
预览 | 主分支 |
可靠性说明
虽然此crate已在世界上得到一些使用且尚未出现任何问题,但它仍然相当新颖且实验性。请谨慎使用(并使用miri!)。
如果您发现任何错误,请 提交问题.
概述
假设您有一个想要实现一些组件的特质。
/// Components that display a message when hovered.
pub trait Tooltip {
/// Text displayed when hovering over an entity with this trait.
fn tooltip(&self) -> &str;
}
为了在bevy中实用,您将想要查询此特质。
// Just add this attribute...
#[bevy_trait_query::queryable]
pub trait Tooltip {
fn tooltip(&self) -> &str;
}
// ...and now you can use your trait in queries.
fn show_tooltips_system(
tooltips: Query<&dyn Tooltip>,
// ...
) {
// ...
}
由于不幸的是Rust缺乏任何类型的反射,因此当应用程序构建时必须注册每个组件与特质。
#[derive(Component)]
struct Player(String);
#[derive(Component)]
enum Villager {
Farmer,
// ...
}
#[derive(Component)]
struct Monster;
/* ...trait implementations omitted for brevity... */
struct TooltipPlugin;
impl Plugin for TooltipPlugin {
fn build(&self, app: &mut App) {
// We must import this trait in order to register our components.
// If we don't register them, they will be invisible to the game engine.
use bevy_trait_query::RegisterExt;
app
.register_component_as::<dyn Tooltip, Player>()
.register_component_as::<dyn Tooltip, Villager>()
.register_component_as::<dyn Tooltip, Monster>()
.add_systems(Update, show_tooltips);
}
}
与具体类型查询不同,实体可以具有多个匹配特质查询的组件。
fn show_tooltips(
tooltips: Query<&dyn Tooltip>,
// ...
) {
// Iterate over each entity that has tooltips.
for entity_tooltips in &tooltips {
// Iterate over each component implementing `Tooltip` for the current entity.
for tooltip in entity_tooltips {
println!("Tooltip: {}", tooltip.tooltip());
}
}
// If you instead just want to iterate over all tooltips, you can do:
for tooltip in tooltips.iter().flatten() {
println!("Tooltip: {}", tooltip.tooltip());
}
}
或者,如果您预计每个实体都只有一个实现特质的组件,您可以使用过滤 One
。这比迭代所有特质实现有显著更好的性能。
use bevy_trait_query::One;
fn show_tooltips(
tooltips: Query<One<&dyn Tooltip>>,
// ...
) {
for tooltip in &tooltips {
println!("Tooltip: {}", tooltip.tooltip());
}
}
性能
特质查询的性能相当具有竞争力。以下是简单情况的基准测试
具体类型 | One | All | |
---|---|---|---|
1匹配 | 16.135 µs | 31.441 µs | 63.273 µs |
2匹配 | 17.501 µs | - | 102.83 µs |
1-2匹配 | - | 16.959 µs | 82.179 µs |
许可证
依赖关系
~15MB
~298K SLoC