2个版本
0.0.3 | 2023年3月16日 |
---|---|
0.0.2 | 2023年3月16日 |
#1858 in 游戏开发
每月 22 次下载
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