#ecs #游戏引擎 #bevy-ecs #通用 #基础 #部分 #内部

wecc

一个适用于通用用途的简单ECS库

1个不稳定版本

0.1.2 2023年7月2日
0.1.0 2023年7月2日

#1603 in 游戏开发

MIT/Apache

43KB
1K SLoC

wecc

wecc (wckd-ecs) 是一个基于 bevy_ecs 的简单ECS库。

动机

在我“Rust游戏开发之路”的旅程中,我想了解幕后的事情是如何工作的,所以我从许多游戏引擎的基础开始,即实体-组件-系统。我通过吞噬 bevy_ecs 并创建自己的版本来做到这一点,具有相似的内部工作和相同的语法,但没有我尚未学习的所有优化。我将在我的个人项目中使用它,并希望增加其功能。

代码示例

- "重力"模拟

use wecs::{query::Query, resource::Res, schedule::Schedule, world::World};

#[derive(Resource, Default)]
pub struct GravityManager {
    gravity: f32,
}

#[derive(Debug, Component)]
pub struct Position {
    x: f32,
    y: f32,
    z: f32,
}

fn main() {
    let mut world = World::new();
    world.insert_resource(GravityManager { gravity: 10.0 });
    world.spawn_entity(Position {
        x: 0.0,
        y: 50.0,
        z: 0.0,
    });

    let mut schedule = Schedule::new()
        .with_system(update_system)
        .with_system(print_system);

    loop {
        schedule.run(&mut world);
        std::thread::sleep(Duration::from_secs(1));
    }
}

fn update_system(query: Query<&mut Position>, manager: Res<GravityManager>) {
    for position in query {
        position.y -= manager.gravity;
    }
}

fn print_system(query: Query<&Position>) {
    for position in query {
        let Position {x, y, z} = position;
        println!("entity position is {x},{y},{z}");
    }
}

输出

实体位置是0,40,0
实体位置是0,30,0
实体位置是0,20,0
实体位置是0,10,0
实体位置是0,0,0
实体位置是0,-10,0
实体位置是0,-20,0
...

- 事件

use wecs::{schedule::Schedule, world::World, EventManager, EventReader, EventWriter};

struct CoolEvent {
    pub num: u32,
}

fn main() {
    let mut world = World::new();
    world.init_resource::<EventManager<CoolEvent>>();

    let mut schedule = Schedule::new();
    schedule.add_system(publish_events);
    schedule.add_system(consume_events);
    schedule.add_system(EventManager::<CoolEvent>::clear);

    schedule.run(&mut world);
}

fn publish_events(mut writer: EventWriter<CoolEvent>) {
    writer.dispatch_one(CoolEvent { num: 0 });
}

fn consume_events(reader: EventReader<CoolEvent>) {
    for event in reader {
        println!("CoolEvent's num is {}", event.num);
    }
}

输出

CoolEvent的数字是0

依赖关系

~120KB