#assets #bevy #file-format #game-assets #bevy-plugin #packer #bundler

bevy-histrion-packer

一个 Bevy 插件,允许将所有游戏资源(如纹理、音频文件和其他资源)有效地打包到一个常见的 PAK 类文件格式中

8 个不稳定版本 (3 个破坏性更新)

0.4.0 2024年7月4日
0.4.0-rc.12024年6月15日
0.3.0 2024年5月20日
0.2.0 2024年2月17日
0.1.3 2023年12月30日

#235 in 游戏开发

Download history 141/week @ 2024-05-20 74/week @ 2024-06-10 14/week @ 2024-06-17 210/week @ 2024-07-01 9/week @ 2024-07-08 22/week @ 2024-07-29

每月113次下载

MIT/Apache

51KB
1K SLoC

Bevy Histrion Packer

MIT or Apache 2.0 Docs Crate

[!WARNING] 此软件包处于早期开发阶段,其 API 可能在未来发生变化。

一个 Bevy 插件,允许将所有游戏资源(如纹理、音频文件和其他资源)有效地打包到一个常见的 PAK 类文件格式中。

用法

打包资源

默认情况下,pack_assets_folder 函数使用 Brotli 压缩元数据,对于一些特定的加载器/扩展使用 Deflate 进行数据压缩

压缩方法 扩展/加载器
.exr, .basis, .ktx2, .qoi, .qoa, .ogg, .oga, .spx, .mp3
Brotli .ron, .json, .yml, .yaml, .toml, .txt, .ini, .cfg, .gltf, .wgsl, .glsl, .hlsl, .vert, .frag, .vs, .fs, .lua, .svg, .js, .html, .css, .xml, .mtlx, .usda
Deflate 默认

使用 pack_assets_folder 函数打包资源文件夹

# Cargo.toml

[dependencies]
bevy = "0.14"
bevy-histrion-packer = "0.4"

[build-dependencies]
bevy = { version = "0.14", features = [
  "asset_processor",
  "file_watcher",
  "embedded_watcher",
] }
bevy-histrion-packer = { version = "0.4", features = [
  "writer",
] }
// build.rs
fn main() -> Result<(), Box<dyn std::error::Error>> {
    // only run this code for release builds
    #[cfg(not(debug_assertions))]
    {
        use bevy::{app::ScheduleRunnerPlugin, prelude::*};
        use bevy_histrion_packer::pack_assets_folder;
        use std::path::Path;

        let imported_assets = Path::new("imported_assets");

        // delete the imported_assets folder
        if imported_assets.exists() {
            std::fs::remove_dir_all(imported_assets)?;
        }

        // generate the processed assets during build time
        let mut app = App::new();

        app.add_plugins(MinimalPlugins.set(ScheduleRunnerPlugin::run_once()))
            .add_plugins(bevy::asset::AssetPlugin {
                mode: AssetMode::Processed,
                ..Default::default()
            })
            .init_asset::<Shader>()
            .init_asset_loader::<bevy::render::render_resource::ShaderLoader>()
            .add_plugins(bevy::render::texture::ImagePlugin::default())
            .add_plugins(bevy::pbr::PbrPlugin::default())
            .add_plugins(bevy::gltf::GltfPlugin::default());

        app.run();

        // pack the assets folder
        let source = Path::new("imported_assets/Default");
        let destination = Path::new("assets.hpak");

        pack_assets_folder(&source, &destination)?;
    }

    Ok(())
}

还可以使用 Writer 获得对打包过程的更多控制

// build.rs
fn main() -> Result<(), Box<dyn std::error::Error>> {
    // only run this code for release builds
    #[cfg(not(debug_assertions))]
    {
        use bevy_histrion_packer::{CompressionAlgorithm, WriterBuilder};
        use std::fs::{File, OpenOptions};
        use std::path::Path;

        let destination = Path::new("assets.hpak");

        let mut writer = WriterBuilder::new(
            OpenOptions::new()
                .write(true)
                .truncate(true)
                .create(true)
                .open(&destination)?,
        )
        .meta_compression(CompressionAlgorithm::Brotli)
        .build()?;

        let mut data = File::open("assets/texture_1.png")?;
        let mut meta = File::open("assets/texture_1.png.meta")?;

        writer.add_entry(
            Path::new("my_texture_path.png"),
            &mut meta,
            &mut data,
            CompressionAlgorithm::Deflate,
        )?;

        // ...

        writer.finish()?;
    }

    Ok(())
}

加载资源

// main.rs
use bevy::prelude::*;
use bevy_histrion_packer::HistrionPackerPlugin;

fn main() {
    let mut app = App::new();

    app.add_plugins(
        DefaultPlugins
            .build()
            .add_before::<bevy::asset::AssetPlugin, HistrionPackerPlugin>(
                HistrionPackerPlugin {
                    source: "assets.hpak".into(),
                    mode: bevy_histrion_packer::HistrionPackerMode::ReplaceDefaultProcessed,
                },
            )
            .set(bevy::asset::AssetPlugin {
                mode: AssetMode::Processed,
                ..default()
            }),
    );

    app.run();
}

功能

功能 描述
deflate 启用 Deflate 压缩算法。
brotli 启用 Brotli 压缩算法。
writer 启用写入功能,可以使用 Writer 手动从文件夹生成 HPAK 文件。

Bevy 兼容性

bevy bevy-histrion-packer
0.14 0.4
0.13 0.2-0.3
0.12 0.1

许可

以下任一许可下双许可

任选其一。

贡献

除非您明确说明,否则您提交的任何旨在包含在作品中的贡献,根据 Apache-2.0 许可证定义,将按照上述方式双许可,无需任何额外条款或条件。

依赖项

~28–66MB
~1.5M SLoC