#3d #engine #game-engine #ecs #game

yuxii

基于ECS的3D游戏引擎

2个版本

0.0.3 2023年3月16日
0.0.2 2023年3月16日

#1858 in 游戏开发

每月 22 次下载

MIT/Apache

42KB
1K SLoC

Yuxii是一个基于ECS的3D游戏引擎。

主要目的是非常简单易用和易学。

警告!目前什么都没做。

入门

节点

在Yuxii中,节点是逻辑和场景的统一。

让我们看看一个例子

/* file: src/my_node/mod.rs */

#[node]
pub struct MyNode;

#[node]
impl MyNode{
  fn init(&self){ }
  fn frame(&self) { }
  fn scene() -> Scene { }
}

好了,我们刚刚创建了一个节点。

init在程序启动时被调用

frame在每一帧异步调用。你可以在这里放置要执行的系统。

scene用于生成实体及其修饰符

但如果不将此节点连接到主程序,它不能执行任何逻辑

所以让我们修复它,并将我们的节点逻辑连接到世界

/* file: src/main.rs */
fn main(){
    MyNode.plug();

    // We can also spawn this node content:
    MyNode::spawn();

    // Run
    Yuxii::run();

}

节点的结构如下

NodeName (Folder)
    mod.rs
    resources.rs
    scene.ron
    systems.rs

系统

您可以从项目的任何部分轻松添加系统,但需要在Yuxii::run()

#[system]
fn my_system(){ /* do something */ }

之后添加它

fn frame(&self){
    my_system();
}

查询

在这个引擎中,查询非常强大(应该是,尚未实现)让我们来看一个例子

#[system]
fn my_system(){
    // This query will be removed by macro and will not appear in docs
    /// *GetMut, &GetRef, Added+, &OptionRef?
    {
        get_mut.field = "oh, hey";
    }

    // And we have even better parenting
    /// Parent:: *GetMut
    {
        parent_get_mut.field = "looks easy";

    }
    // Custom naming
    /// *[my_vel]Velocity
    {
        my_vel;
    }
}

资源

组件

#[derive(Component)]
pub struct MyComponent{
    /// def 9
    pub field: i32,
    /// def "Hello World"
    pub private: String
}

它将根据文档中的属性自动实现Default。

添加组件

let entity = World::spawn();

entity << MyComponent{ field: 65, ..default() };

全局

#[derive(Global)]
pub struct MyGlobal{
    /// def "It is global" 
    pub info: String
}

全局实例在其定义时自动添加到世界。这意味着,您可以在定义之后访问它。

fn system(){
    let lock = MyGlobal::read();

    log << "MyGlobal info: " << lock.info;
}

信号

todo!();

依赖关系

~8–39MB
~584K SLoC