13个版本 (8个稳定版)
1.2.0 | 2021年5月14日 |
---|---|
1.1.2 | 2021年3月29日 |
0.100.1 | 2021年1月4日 |
0.99.2 | 2020年12月23日 |
#514 in 游戏开发
每月48次下载
在 3 crates 中使用
28KB
491 行
支持开源开发者!♥️
World Dispatcher
完整ECS(实体-组件-系统)的系统部分。
它还包含一个 World
结构,它包含系统使用的游戏数据,以及用于并行和优化顺序执行系统的 Dispatcher
。
你为什么使用这个ECS库?
- 与所有平台兼容,包括WASM!
- 操作速度快,不仅限于迭代。
- 依赖项最少。
- 代码体积小。
- 稳定,已测试,基准测试,100%完成。
用法
将以下内容添加到您的Cargo.toml文件中
world_dispatcher = "*"
使用方法如下
use world_dispatcher::*;
fn main() {
#[derive(Default)]
pub struct A;
let mut world = World::default();
let sys = (|_comps: &A| Ok(())).system();
let mut dispatch = DispatcherBuilder::new().add_system(sys).build(&mut world);
dispatch.run_seq(&world).unwrap();
dispatch.run_seq(&world).unwrap();
dispatch.run_seq(&world).unwrap();
assert!(world.get::<A>().is_ok());
}
大多数函数也可以转换为系统。
这有五个要求
- 只接受 & 和 &mut 引用作为参数
- 返回一个 SystemResult
- 在使用参数中的所有 & 引用之前,使用所有 &mut 引用。
- 参数中不要重复使用同一类型。
- 参数中的所有类型都必须实现
Default
。如果没有,则使用&/&mut Option<YourType>
代替。
use world_dispatcher::*;
#[derive(Default)]
pub struct A;
#[derive(Default)]
pub struct B;
#[derive(Default)]
pub struct C;
pub struct D;
fn system_function(_a: &A, _b: &B, _c: &mut C, d: &mut Option<D>) -> SystemResult {
assert!(d.is_some());
Ok(())
}
fn main() {
let mut world = World::default();
// Will automatically create A, B, C, Option<D>::None inside of world.
let mut dispatch = DispatcherBuilder::new().add(system_function).build(&mut world);
// Let's assign a value to D.
*world.get_mut::<Option<D>>().unwrap() = Some(D);
dispatch.run_seq(&world).unwrap();
dispatch.run_seq(&world).unwrap();
dispatch.run_seq(&world).unwrap();
assert!(world.get::<Option<D>>().unwrap().is_some());
}
如果您需要超过12个系统参数,有一个名为 big_systems
的功能,可以将该限制提高到22。如果使用它,第一次编译的时间大约为10秒。后续编译将是瞬间的。
维护者信息
- 维护者:Jojolepro
- 联系方式:jojolepro [at] jojolepro [dot] com
- 网站: jojolepro.com
- Patreon: patreon
依赖项
~0–1MB
~15K SLoC