#prefab #lazy-evaluation #component #bevy #command #entity #text

bevy_lazy_prefabs

bevy中简单易读/易写的预制件文本文件

2个版本

0.2.1 2021年12月26日
0.2.0 2021年12月25日

#15 in #prefab

MIT许可证

74KB
1K SLoC

License: MIT Crates.io docs

Bevy Lazy Prefabs

用于bevy中简单易读/易写的预制件文本文件的crate。

注意:这不是一个灵活的长期预制件解决方案,但它应该适用于简单的游戏和原型设计,以避免在代码中完全定义实体。

.Prefab文件

首先,编写一个.prefab文件并将其放在assets/prefabs目录中。

SomePrefab {                   // Prefab name is optional. Outer braces are required. 
    Transform {                // Components are listed by type name.
        translation : Vec3 {   // Component fields can be initialized inside nested curly braces.
            x: 15.0, y: 10.5,  // Any omitted fields will be initialized to default.
        },
    },
    Visible,                   // If you choose not to initialize any fields, the braces can be omitted entirely.
    Draw,
    SomeComponent {            // Custom components are supported
        some_int: 15,
    },
}

在上面的示例中,我们正在创建一个具有TransformVisibleDrawSomeComponent组件的预制件。在这种情况下,实体的变换将在实体生成时初始化为位置(15.0,10.0,0.0)。

自定义组件只有在派生自ReflectDefault,并且具有#[reflect)]属性时才会在预制件中起作用。大多数内置bevy类型已经满足这个约束。它们还必须在设置期间与[PrefabRegistry]注册。

上面的预制件并没有什么用处——实体将不会被渲染,因为它没有网格或材质。为此,我们可以使用build_commands::BuildPrefabCommand

构建预制件命令

构建命令允许您包含需要额外步骤才能正确初始化的复杂组件,例如网格、材质或包。

可以编写自定义命令,但已包含了一些更常见的组件

  • InsertSpriteBundle - 在实体上插入一个SpriteBundle。可以指定colortexture_path
  • SetColorMaterial - 修改实体上的现有ColorMaterial
  • LoadPrefab - 加载现有预制件并在当前实体上执行其构建步骤。
  • InsertPbrBundle - 插入一个PbrBundle。可以指定网格shapesizeflip
  • InsertOrthographicCameraBundle - 插入一个OrthographicCameraBundle。可以指定scale
  • InsertPerspectiveCameraBundle - 插入一个 PerspectiveCameraBundle。可以指定 positionlooking_at

示例

{
    InsertSpriteBundle! (          
        texture_path: "alien.png", 
        color: Color::RED,         
    ),
}

上面的 .prefab 文件将生成一个包含来自 SpriteBundle 所有组件的实体。精灵包的 ColorMaterial 组件将使用给定的纹理和颜色初始化。

注意这些 '字段' 并非直接指代包中的字段,而是可选属性,在构建命令中传递并用于初始化过程。这些属性如何使用由每个单独的构建命令定义。

生成预制体

一旦你的 .prefab 文件位于 assets/prefabs 目录中,你可以使用 [PrefabRegistry] 和 Commands 生成预制体。

use bevy::prelude::*;
use bevy_lazy_prefabs::*;

fn setup(mut commands: Commands, mut registry: ResMut<PrefabRegistry>) {
  let sprite = registry.load("sprite.prefab").unwrap();
  commands.spawn().insert_prefab(sprite);
  let cam = registry.load("cam_2d.prefab").unwrap();
  commands.spawn().insert_prefab(cam);
 }

依赖项

~32–75MB
~643K SLoC