mirror of
https://github.com/bevyengine/bevy
synced 2024-12-19 09:33:06 +00:00
f7f7e326e5
# Objective `FromWorld` is often used to group loading and creation of assets for resources. With this setup, users often end up repetitively calling `.resource::<AssetServer>` and `.resource_mut::<Assets<T>>`, and may have difficulties handling lifetimes of the returned references. ## Solution Add extension methods to `World` to add and load assets, through a new extension trait defined in `bevy_asset`. ### Other considerations * This might be a bit too "magic", as it makes implicit the resource access. * We could also implement `DirectAssetAccessExt` on `App`, but it didn't feel necessary, as `FromWorld` is the principal use-case here. --- ## Changelog * Add the `DirectAssetAccessExt` trait, which adds the `add_asset`, `load_asset` and `load_asset_with_settings` method to the `World` type.
50 lines
1.8 KiB
Rust
50 lines
1.8 KiB
Rust
//! Add methods on `World` to simplify loading assets when all
|
|
//! you have is a `World`.
|
|
|
|
use bevy_ecs::world::World;
|
|
|
|
use crate::{meta::Settings, Asset, AssetPath, AssetServer, Assets, Handle};
|
|
|
|
pub trait DirectAssetAccessExt {
|
|
/// Insert an asset similarly to [`Assets::add`].
|
|
fn add_asset<A: Asset>(&mut self, asset: impl Into<A>) -> Handle<A>;
|
|
|
|
/// Load an asset similarly to [`AssetServer::load`].
|
|
fn load_asset<'a, A: Asset>(&self, path: impl Into<AssetPath<'a>>) -> Handle<A>;
|
|
|
|
/// Load an asset with settings, similarly to [`AssetServer::load_with_settings`].
|
|
fn load_asset_with_settings<'a, A: Asset, S: Settings>(
|
|
&self,
|
|
path: impl Into<AssetPath<'a>>,
|
|
settings: impl Fn(&mut S) + Send + Sync + 'static,
|
|
) -> Handle<A>;
|
|
}
|
|
impl DirectAssetAccessExt for World {
|
|
/// Insert an asset similarly to [`Assets::add`].
|
|
///
|
|
/// # Panics
|
|
/// If `self` doesn't have an [`AssetServer`] resource initialized yet.
|
|
fn add_asset<'a, A: Asset>(&mut self, asset: impl Into<A>) -> Handle<A> {
|
|
self.resource_mut::<Assets<A>>().add(asset)
|
|
}
|
|
|
|
/// Load an asset similarly to [`AssetServer::load`].
|
|
///
|
|
/// # Panics
|
|
/// If `self` doesn't have an [`AssetServer`] resource initialized yet.
|
|
fn load_asset<'a, A: Asset>(&self, path: impl Into<AssetPath<'a>>) -> Handle<A> {
|
|
self.resource::<AssetServer>().load(path)
|
|
}
|
|
/// Load an asset with settings, similarly to [`AssetServer::load_with_settings`].
|
|
///
|
|
/// # Panics
|
|
/// If `self` doesn't have an [`AssetServer`] resource initialized yet.
|
|
fn load_asset_with_settings<'a, A: Asset, S: Settings>(
|
|
&self,
|
|
path: impl Into<AssetPath<'a>>,
|
|
settings: impl Fn(&mut S) + Send + Sync + 'static,
|
|
) -> Handle<A> {
|
|
self.resource::<AssetServer>()
|
|
.load_with_settings(path, settings)
|
|
}
|
|
}
|