Bevy如何根据参数的类型“范围”其系统?

问题描述

Bevy是一种新的Rust游戏引擎和ECS,具有一项功能,可以根据参数的类型来“监视”其系统。来自its docs

我们传递给“系统功能”的参数定义了系统在哪些实体上运行。在这种情况下,greet_people将在具有Person and Name组件的所有实体上运行。

它看起来像这样:

struct Person;
struct Name(String);

fn greet_people(person: &Person,name: &Name) {
    println!("hello {}",name.0);
}

Bevy如何做到这一点?我以为我读过某个地方,Rust不支持这种反射方式。

解决方法

Bevy定义了一组特征(IntoQuerySystemIntoForEachSystem),这些特征由与那些签名匹配的函数实现。这些特征然后由Bevy前奏导出。这样做的局限性之一是,您最多只能将函数转换为一定数量的参数到系统中,并且参数必须按特定的顺序排列([命令?],[资源...],[查询/组件。 ..])。