gpt4 book ai didi

rust - 如何向场景中产生的实体添加组件?

转载 作者:行者123 更新时间:2023-12-03 11:44:25 26 4
gpt4 key购买 nike

在具有以下名为my_scene.scn的场景文件的Bevy项目中:

[
(
entity: 0,
components: [
{
"type": "Transform",
"map": {
"translation": {
"type": "Vec3",
"value": (150.0, 200.0, 0.0),
},
"rotation": {
"type": "Quat",
"value": (0.0, 0.0, 0.0, 1.0),
},
"scale": {
"type": "Vec3",
"value": (0.75, 0.75, 0.0),
},
},
},
]
)
]
并在 this official Bevyexample之后使用此源代码:
use bevy::prelude::*;

fn main() {
App::build()
.add_plugins(DefaultPlugins)
.add_startup_system(load_scene_system.system())
.run();
}

fn load_scene_system(asset_server: Res<AssetServer>, mut scene_spawner: ResMut<SceneSpawner>) {
let scene_handle: Handle<Scene> = asset_server.load("my_scene.scn");

scene_spawner.spawn_dynamic(scene_handle);
// ^ How to add components to entities created here ?

asset_server.watch_for_changes().unwrap();
}
我想向该实体0添加其他组件,例如 SpriteComponents。我该如何实现?

最佳答案

这是我想出的解决方案。这个想法是存储一个组件
包含创建更动态组件的信息。
例如,要动态加载场景文件中引用的Sprite图片,我们
可以定义一个SpriteLoader组件,然后添加一个系统,该系统将用我们想要的组件替换此加载器组件。

use bevy::prelude::*;

fn main() {
App::build()
.add_plugins(DefaultPlugins)
.register_component::<SpriteLoader>()
.add_startup_system(load_scene_system.system())
.add_system(load_sprite_system.system())
.run();
}

fn load_scene_system(asset_server: Res<AssetServer>, mut scene_spawner: ResMut<SceneSpawner>) {
let scene_handle: Handle<DynamicScene> = asset_server.load("my_scene.scn");
scene_spawner.spawn_dynamic(scene_handle);
asset_server.watch_for_changes().unwrap();
}

/// Component indicating that a sprite will be loaded for the entity.
#[derive(Properties, Default)]
pub struct SpriteLoader {
/// Path of the sprite to load
pub path: String
}

/// Replaces the `SpritLoader` component with the corresponding `SpriteComponents`.
pub fn load_sprite_system(
mut commands: Commands,
asset_server: Res<AssetServer>,
mut materials: ResMut<Assets<ColorMaterial>>,
query: Query<(Entity, Added<SpriteLoader>)>,
) {
for (entity, sprite_loader) in query.iter() {
commands.remove_one::<SpriteLoader>(entity);

let path = PathBuf::from(sprite_loader.path.clone());

commands.insert(
entity,
SpriteComponents {
material: materials.add(asset_server.load(path).into()),
..SpriteComponents::default()
},
);
}
}
在这里,将 SpriteLoader添加到实体后, load_sprite_system系统将其删除并插入一个
改为 SpriteComponents。根据 the doc of insert ,这
将替换先前的 SpriteComponents
对应的场景文件是:
[
(
entity: 0,
components: [
{
"type": "SpriteLoader",
"map": {
"path": "my_sprite.png",
},
},
]
)
]

关于rust - 如何向场景中产生的实体添加组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64798465/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com