bevy 0.19.0

A refreshingly simple data-driven game engine and app framework
Documentation
---
title: Asset Saving
authors: ["@andriyDev"]
pull_requests: [22622]
---

Bevy has had an [`AssetSaver`] trait since 0.12.
However, it was only ever intended for use inside asset processing pipelines, not for saving assets at runtime.
This left a frustrating gap: there was no supported way to save a procedurally generated mesh, a baked lightmap, or the output of an in-editor workflow.

Now there is.

[`save_using_saver`] lets you save any asset to disk using an [`AssetSaver`] implementation of your choice.

## 1. Building the [`SavedAsset`]

For simple assets with no sub-assets, use [`SavedAsset::from_asset`]:

```rust
let main_asset = InlinedBook {
    lines: vec!["Save me!".to_string(), "Please!".to_string()],
};
let saved_asset = SavedAsset::from_asset(&main_asset);
```

For assets that reference other assets (sub-assets), use [`SavedAssetBuilder`]:

```rust
let asset_path: AssetPath<'static> = "my/file/path.whatever".into();
let mut builder = SavedAssetBuilder::new(asset_server.clone(), asset_path.clone());

let subasset_1 = Line("howdy".into());
let subasset_2 = Line("goodbye".into());
let handle_1 = builder.add_labeled_asset_with_new_handle(
    "TheFirstLabel", SavedAsset::from_asset(&subasset_1));
let handle_2 = builder.add_labeled_asset_with_new_handle(
    "AnotherOne", SavedAsset::from_asset(&subasset_2));

let main_asset = Book {
    lines: vec![handle_1, handle_2],
};
let saved_asset = builder.build(&main_asset);
```

[`SavedAsset`] borrows rather than owns its assets.
That means you can build and save in the same async block — no need to transfer ownership first.

## 2. Calling [`save_using_saver`]

```rust
save_using_saver(
    asset_server.clone(),
    &MyAssetSaver::default(),
    &asset_path,
    saved_asset,
    &MySettings::default(),
).await.unwrap();
```

[`save_using_saver`] is async; generally, you'll want to spawn it with `IoTaskPool::get().spawn(...)`.
You'll also need to implement [`AssetSaver`] for `MyAssetSaver` to define the serialization format.

[`save_using_saver`]: https://docs.rs/bevy/0.19.0/bevy/asset/saver/fn.save_using_saver.html
[`SavedAssetBuilder`]: https://docs.rs/bevy/0.19.0/bevy/asset/saver/struct.SavedAssetBuilder.html
[`AssetSaver`]: https://docs.rs/bevy/0.19.0/bevy/asset/saver/trait.AssetSaver.html
[`SavedAsset`]: https://docs.rs/bevy/0.19.0/bevy/asset/saver/struct.SavedAsset.html
[`SavedAsset::from_asset`]: https://docs.rs/bevy/0.19.0/bevy/asset/saver/struct.SavedAsset.html#method.from_asset