#ecs #component #entity

no-std shipyard

实体组件系统

24次发布

0.7.1 2024年7月20日
0.6.5 2024年7月9日
0.6.2 2022年8月11日
0.6.0-alpha.42022年7月13日
0.2.0 2019年8月18日

#19 in 游戏开发

Download history 194/week @ 2024-05-04 259/week @ 2024-05-11 202/week @ 2024-05-18 274/week @ 2024-05-25 323/week @ 2024-06-01 225/week @ 2024-06-08 327/week @ 2024-06-15 603/week @ 2024-06-22 165/week @ 2024-06-29 363/week @ 2024-07-06 395/week @ 2024-07-13 369/week @ 2024-07-20 178/week @ 2024-07-27 242/week @ 2024-08-03 258/week @ 2024-08-10 212/week @ 2024-08-17

907 每月下载
用于 26 个Crate (13 直接)

MIT/Apache

1MB
20K SLoC

Shipyard ⚓

Shipyard是一个专注于可用性和速度的实体组件系统。

如果您有任何问题或想更密切地关注开发,请聊天

Crates.io Documentation LICENSE

指南大师 | 指南0.7 | 演示 | 可视化工具

基本示例

use shipyard::{Component, IntoIter, View, ViewMut, World};

#[derive(Component)]
struct Health(u32);
#[derive(Component)]
struct Position {
    x: f32,
    y: f32,
}

fn in_acid(positions: View<Position>, mut healths: ViewMut<Health>) {
    for (_, health) in (&positions, &mut healths)
        .iter()
        .filter(|(pos, _)| is_in_acid(pos))
    {
        health.0 -= 1;
    }
}

fn is_in_acid(_: &Position) -> bool {
    // it's wet season
    true
}

fn main() {
    let mut world = World::new();

    world.add_entity((Position { x: 0.0, y: 0.0 }, Health(1000)));

    world.run(in_acid);
}

小型游戏示例

灵感来自Erik Hazzard的矩形吞噬者

Play Source

目录

名字的由来

装配线接受输入,在每个步骤处理,然后输出结果。只要它们不相互干扰,就可以有多个并行工作。

威尼斯造船厂这样的造船厂是成功的大型规模工业装配线的最古老例子之一。它的成功足以每天输出一艘完全完成的船只。

Shipyard是一个你可以用来构建自己的高度并行软件流程的项目。

动机

我最初想创建一个ECS来学习它是如何工作的。在一次失败的尝试和一些研究之后,我开始着手开发Shipyard。

Specs 已经作为首选的Rust ECS而确立,但我认为我可以做得更好,并选择了 EnTT 的核心数据结构 (SparseSet) 和分组模型。一个非常灵活的组合。

Cargo功能

  • parallel (默认) — 启用工作负载线程和添加并行迭代器
  • proc (默认) — 从 shipyard_proc 重新导出宏,主要用于推导 Component
  • serde1 — 使用 serde 添加(反)序列化支持
  • std (默认) — 允许Shipyard使用标准库
  • thread_local — 添加与 !Send!Sync 组件协同工作的方法和类型
  • tracing — 报告工作负载和系统执行

许可证

许可证为以下之一

任选其一。

贡献

除非你明确说明,否则根据 Apache-2.0 许可证定义的任何贡献,有意提交给作品,将按上述方式双重许可,不附加任何额外条款或条件。

依赖关系

~1–1.7MB
~27K SLoC