#traits #bevy #query #gamedev #plugin #game-engine

bevy-trait-query

bevy游戏引擎的特质查询实现

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

0.5.1 2024年3月25日
0.5.0 2024年3月25日
0.4.0 2023年11月5日
0.3.0 2023年7月10日
0.0.3 2022年10月18日

#88 in 游戏开发

Download history 121/week @ 2024-04-07 83/week @ 2024-04-14 97/week @ 2024-04-21 65/week @ 2024-04-28 61/week @ 2024-05-05 100/week @ 2024-05-12 128/week @ 2024-05-19 79/week @ 2024-05-26 114/week @ 2024-06-02 53/week @ 2024-06-09 40/week @ 2024-06-16 82/week @ 2024-06-23 35/week @ 2024-06-30 65/week @ 2024-07-07 45/week @ 2024-07-14 45/week @ 2024-07-21

每月197次下载
用于 3 crates

MIT/Apache

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

许可证

MITAPACHE-2.0

依赖关系

~15MB
~298K SLoC