Rust资源加载插件bevy_asset_loader_derive的使用:简化Bevy游戏引擎资源管理流程
Rust资源加载插件bevy_asset_loader_derive的使用:简化Bevy游戏引擎资源管理流程
bevy_asset_loader_derive提供了AssetCollection
trait的派生宏。您很可能不需要直接使用这个crate。请查看bevy_asset_loader的README和示例了解如何使用这个派生宏。
许可证
双许可协议:
- Apache License, Version 2.0
- MIT license
您可以任选其一。
示例使用
下面是一个完整的示例demo,展示如何使用bevy_asset_loader_derive简化资源管理:
use bevy::prelude::*;
use bevy_asset_loader::prelude::*;
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_loading_state(
LoadingState::new(GameState::Loading)
.continue_to_state(GameState::Ready)
.with_collection::<GameAssets>()
)
.add_state(GameState::Loading)
.add_system_set(
SystemSet::on_enter(GameState::Ready)
.with_system(use_loaded_assets)
)
.run();
}
#[derive(AssetCollection)]
struct GameAssets {
#[asset(path = "textures/player.png")]
player: Handle<Image>,
#[asset(path = "textures/enemy.png")]
enemy: Handle<Image>,
#[asset(path = "audio/background.ogg")]
background_music: Handle<AudioSource>,
}
#[derive(Clone, Eq, PartialEq, Debug, Hash)]
enum GameState {
Loading,
Ready,
}
fn use_loaded_assets(assets: Res<GameAssets>) {
// 在这里可以使用加载好的资源
// 例如: assets.player, assets.enemy, assets.background_music
}
安装
在您的项目目录中运行以下Cargo命令:
cargo add bevy_asset_loader_derive
或者在您的Cargo.toml中添加以下行:
bevy_asset_loader_derive = "0.23.0"
完整示例代码
// 引入必要的模块
use bevy::prelude::*;
use bevy_asset_loader::prelude::*;
fn main() {
// 创建Bevy应用
App::new()
// 添加默认插件集
.add_plugins(DefaultPlugins)
// 设置加载状态
.add_loading_state(
LoadingState::new(GameState::Loading)
// 加载完成后自动切换到Ready状态
.continue_to_state(GameState::Ready)
// 加载GameAssets集合
.with_collection::<GameAssets>()
)
// 添加游戏状态
.add_state(GameState::Loading)
// 添加系统集,在进入Ready状态时执行
.add_system_set(
SystemSet::on_enter(GameState::Ready)
.with_system(use_loaded_assets)
)
.run();
}
// 定义资源集合结构体
#[derive(AssetCollection)]
struct GameAssets {
// 加载玩家纹理
#[asset(path = "textures/player.png")]
player: Handle<Image>,
// 加载敌人纹理
#[asset(path = "textures/enemy.png")]
enemy: Handle<Image>,
// 加载背景音乐
#[asset(path = "audio/background.ogg")]
background_music: Handle<AudioSource>,
}
// 定义游戏状态枚举
#[derive(Clone, Eq, PartialEq, Debug, Hash)]
enum GameState {
Loading, // 加载状态
Ready, // 准备就绪状态
}
// 使用已加载资源的函数
fn use_loaded_assets(assets: Res<GameAssets>) {
// 在这里可以使用加载好的资源
// 例如: assets.player, assets.enemy, assets.background_music
}
1 回复
Rust资源加载插件bevy_asset_loader_derive的使用:简化Bevy游戏引擎资源管理流程
介绍
bevy_asset_loader_derive
是一个为 Bevy 游戏引擎设计的 Rust 过程宏插件,它通过派生宏简化了游戏资源加载和管理流程。该插件可以帮助开发者以声明式的方式定义游戏资源,自动处理资源加载状态,并减少样板代码。
主要特点
- 简化资源定义和加载流程
- 自动处理资源加载状态
- 类型安全的资源访问
- 与 Bevy 的 ECS 系统无缝集成
- 减少资源管理相关的样板代码
完整示例demo
下面是一个完整的游戏资源加载示例,展示了如何使用bevy_asset_loader_derive
管理游戏中的多种资源:
use bevy::prelude::*;
use bevy_asset_loader::prelude::*;
use bevy_asset_loader_derive::AssetCollection;
// 定义游戏状态
#[derive(Clone, Eq, PartialEq, Debug, Hash, Default, States)]
enum GameState {
#[default]
Loading,
Menu,
Playing,
}
// 主资源集合
#[derive(AssetCollection, Resource)]
struct GameAssets {
// 单个纹理资源
#[asset(path = "textures/player.png")]
player: Handle<Image>,
// 音频资源
#[asset(path = "sounds/background.ogg")]
background_music: Handle<AudioSource>,
// 字体资源
#[asset(path = "fonts/roboto.ttf")]
font: Handle<Font>,
// 批量加载场景资源
#[asset(collection)]
levels: Vec<Handle<Scene>>,
// 标准材质
#[asset(standard_material)]
#[asset(path = "textures/player.png")]
player_material: Handle<StandardMaterial>,
}
// UI资源集合
#[derive(AssetCollection, Resource)]
struct UiAssets {
#[asset(path = "ui/main_menu.png")]
menu_background: Handle<Image>,
#[asset(path = "ui/button.png")]
button: Handle<Image>,
}
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.init_state::<GameState>()
// 设置加载状态
.add_loading_state(
LoadingState::new(GameState::Loading)
.continue_to_state(GameState::Menu)
.load_collection::<GameAssets>()
.load_collection::<UiAssets>()
)
// 添加系统
.add_systems(OnEnter(GameState::Menu), setup_menu)
.add_systems(OnEnter(GameState::Playing), setup_game)
.run();
}
// 菜单系统
fn setup_menu(
game_assets: Res<GameAssets>,
ui_assets: Res<UiAssets>,
mut commands: Commands,
) {
// 使用加载好的资源创建UI
commands.spawn(Camera2dBundle::default());
// 示例:使用UI资源创建按钮
commands.spawn(SpriteBundle {
texture: ui_assets.button.clone(),
..default()
});
// 示例:播放背景音乐
commands.spawn(AudioBundle {
source: game_assets.background_music.clone(),
settings: PlaybackSettings::LOOP,
});
}
// 游戏系统
fn setup_game(
game_assets: Res<GameAssets>,
mut commands: Commands,
) {
// 示例:生成玩家实体
commands.spawn(SpriteBundle {
texture: game_assets.player.clone(),
..default()
});
// 示例:加载第一关
if let Some(level) = game_assets.levels.first() {
commands.spawn(SceneBundle {
scene: level.clone(),
..default()
});
}
}
项目结构建议
为使上述代码正常工作,建议的项目资源目录结构如下:
assets/
├── textures/
│ ├── player.png
│ └── ...
├── sounds/
│ ├── background.ogg
│ └── ...
├── fonts/
│ ├── roboto.ttf
│ └── ...
├── scenes/
│ ├── level1.scn
│ ├── level2.scn
│ └── ...
└── ui/
├── main_menu.png
├── button.png
└── ...
总结
这个完整示例展示了如何使用bevy_asset_loader_derive
:
- 定义多个资源集合
- 使用状态管理控制加载流程
- 批量加载同类型资源
- 加载标准材质
- 在游戏不同状态下使用加载好的资源
通过这种方式,你可以将资源管理代码与游戏逻辑分离,使代码更加清晰和易于维护。