#assets #bevy #gamedev

bevy-embasset

一个将资源嵌入游戏或从其他来源加载资源的Bevy插件!

7个版本 (4个破坏性更新)

0.5.0 2022年4月17日
0.4.1 2022年2月17日
0.3.0 2022年2月7日
0.2.0 2022年1月17日
0.1.2 2022年1月16日

#1781 in 游戏开发

MIT/Apache

38KB
669

Bevy-Embasset

Crate Release Doc Test Status

将资源文件夹嵌入到二进制文件中。

bevy-embasset增加了从二进制文件中加载资源的支持。

此外,它可以选择先尝试通过默认的AssetPlugin加载资源,从而允许在出现问题时将嵌入的资源用作后备。

作为甜点,bevy-embasset允许注册多个其他AssetServer,这些服务器将用于以特定可配置字符串开头的资源路径。这可以用于使一些资源从例如网络服务加载,而其他资源则从磁盘加载或嵌入到二进制文件中。它还可以用于例如构建1个或多个子crates,每个crates都使用EmbassetIo并包含一组资源 - 因此在编译时节省时间,因为资源不需要每次都编译(这种方法的例子可以在游戏bevoids中找到)。

用法

添加带有一些资源的枚举、处理这些资源的AssetIo以及可以处理所有加载/路由的EmbassetIo的简单方法是

use bevy::{prelude::*, asset::AssetPlugin};
use bevy_embasset::{EmbassetPlugin, embasset_assets};

embasset_assets!(
    pub enum GameAssets {
        #[doc = "It's possible to document each enum variant"]
        Icon = "icon.png",
        BackgroundMusic = "sounds/bg.wav"
    },
    pub struct GameAssetsIo {
        root = "../assets/"
    }
);

fn main() {
    App::new().add_plugins_with(DefaultPlugins, |group| {
        group.add_before::<AssetPlugin, _>(EmbassetPlugin::new(|io| {
            io.add_handler(GameAssetsIo::new().into());
        }))
    });
}

注意,在上面的例子中,GameAssetsGameAssetsIo(由宏定义)可以移动到单独的crates中 - 节省编译时间。

定义的GameAssets实现了几个有用的标准特性:EqOrdHashCopy。它可以通过调用GameAssets::iter()进行迭代,资源数量在GameAssets::COUNT中可用。

通过添加的EmbassetPlugin加载资源的路径可以通过例如GameAssets::Icon.path()检索。

fn some_asset_loading_system(asset_server: &AssetServer) {
  let icon : Handle<Image> = asset_server.load(GameAssets::Icon.path());
}

使用build.rs,无需识别枚举

use bevy::{prelude::*, asset::AssetPlugin};
use bevy_embasset::AddEmbassetPlugin;

```rust
use bevy::{prelude::*, asset::AssetPlugin};
use bevy_embasset::EmbassetPlugin;

fn main() {
    App::new().add_plugins_with(DefaultPlugins, |group| {
        group.add_before::<AssetPlugin, _>(EmbassetPlugin::new(add_embasset_assets))
    });
}

从构建脚本(build.rs)生成add_embasset_assets函数

use std::{env, path::Path};

fn main() {
    // Do this to include all files in the asset folder:
    bevy_embasset::include_all_assets(
        &Path::new(&env::var("CARGO_MANIFEST_DIR").unwrap()).join("assets"),
    );
}

并将其包含在源文件中

include!(concat!(env!("OUT_DIR"), "/add_embasset_assets.rs"));

对于构建脚本,需要在 Cargo.toml 中启用 build 功能

[build-dependencies]
bevy-embasset = { version = "*", features = ["build"] }

Bevy 兼容性

bevy-embasset Bevy
main 0.6

依赖项

~17–34MB
~533K SLoC