8 个不稳定版本 (3 个破坏性更新)
0.4.0 | 2024年7月4日 |
---|---|
0.4.0-rc.1 | 2024年6月15日 |
0.3.0 | 2024年5月20日 |
0.2.0 | 2024年2月17日 |
0.1.3 | 2023年12月30日 |
#235 in 游戏开发
每月113次下载
51KB
1K SLoC
Bevy Histrion Packer
[!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 版 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 https://open-source.org.cn/licenses/MIT)
任选其一。
贡献
除非您明确说明,否则您提交的任何旨在包含在作品中的贡献,根据 Apache-2.0 许可证定义,将按照上述方式双许可,无需任何额外条款或条件。
依赖项
~28–66MB
~1.5M SLoC