#bevy-ecs #ecs #bevy #game #send-sync

bevy_register_in_world

在运行时将类型注册到世界中

1 个不稳定版本

0.14.0 2024年8月16日

#1151游戏开发

Download history 96/week @ 2024-08-10

96 每月下载次数

MIT/Apache

20KB
204

Crate提供了一种跟踪初始化到世界中的类型的方法,在添加时自动初始化组件到世界,并在运行时方便地添加系统。

动机

有时在构建应用程序的阶段初始化所有内容是不可能的,或者将非常困难。例如

#[derive(Component)]
struct GenericComponent<A, B>(A, B)
    where A: Send + Sync + 'static, B: Send + Sync + 'static;

fn system_operating_on_generic_component<A, B>(query: Query<&GenericComponent<A, B>>)
    where A: Send + Sync + 'static, B: Send + Sync + 'static 
{
    // do_something ...
}

在bevy ecs中使用泛型类型的常见方法是为世界提供一种方法来注册与泛型参数相关的所有数据。例如,add_event将所有必要的数据注册到应用程序中,以便可以处理注册的事件。仍然应该首选这种处理泛型的方法,因为它避免了不必要的运行时检查。

但是,在上面的情况下,为了使其可行,用户应该预先为程序注册所有可能的泛型组合。

因此,使用这个库,您可以这样做

use bevy_register_in_world::prelude::*;

#[derive(ComponentAutoRegister)]
struct GenericComponent<A, B>(A, B)
    where A: Send + Sync + 'static, B: Send + Sync + 'static;

impl<A, B> RegisterInWorld for GenericComponent<A, B> 
    where A: Send + Sync + 'static, B: Send + Sync + 'static
{
    fn register(mut world: DeferredWorld) {
        world.add_systems(Update, system_operating_on_generic_component::<A, B>);
    }
}

fn system_operating_on_generic_component<A, B>(query: Query<&GenericComponent<A, B>>) 
    where A: Send + Sync + 'static, B: Send + Sync + 'static
{
    // do_something ...
}

当具有唯一泛型组合的组件被添加时,在它的on_add钩子期间调用register

依赖关系

~8–11MB
~177K SLoC