77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use bevy::{asset::AssetLoader, prelude::*};
 | |
| use ron::de::from_bytes;
 | |
| use serde::Deserialize;
 | |
| use std::path::Path;
 | |
| 
 | |
| #[derive(Deserialize)]
 | |
| pub struct MyCustomData {
 | |
|     pub num: i32,
 | |
| }
 | |
| 
 | |
| #[derive(Deserialize)]
 | |
| pub struct MySecondCustomData {
 | |
|     pub is_set: bool,
 | |
| }
 | |
| 
 | |
| // create a custom loader for data files
 | |
| #[derive(Default)]
 | |
| pub struct DataFileLoader {
 | |
|     matching_extensions: Vec<&'static str>,
 | |
| }
 | |
| 
 | |
| impl DataFileLoader {
 | |
|     pub fn from_extensions(matching_extensions: Vec<&'static str>) -> Self {
 | |
|         DataFileLoader {
 | |
|             matching_extensions,
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl<TAsset> AssetLoader<TAsset> for DataFileLoader
 | |
| where
 | |
|     for<'de> TAsset: Deserialize<'de>,
 | |
| {
 | |
|     fn from_bytes(&self, _asset_path: &Path, bytes: Vec<u8>) -> Result<TAsset, anyhow::Error> {
 | |
|         Ok(from_bytes::<TAsset>(bytes.as_slice())?)
 | |
|     }
 | |
| 
 | |
|     fn extensions(&self) -> &[&str] {
 | |
|         self.matching_extensions.as_slice()
 | |
|     }
 | |
| }
 | |
| 
 | |
| /// This example illustrates various ways to load assets
 | |
| fn main() {
 | |
|     App::build()
 | |
|         .add_default_plugins()
 | |
|         .add_asset::<MyCustomData>()
 | |
|         .add_asset_loader_from_instance::<MyCustomData, DataFileLoader>(
 | |
|             DataFileLoader::from_extensions(vec!["data1"]),
 | |
|         )
 | |
|         .add_asset::<MySecondCustomData>()
 | |
|         .add_asset_loader_from_instance::<MySecondCustomData, DataFileLoader>(
 | |
|             DataFileLoader::from_extensions(vec!["data2"]),
 | |
|         )
 | |
|         .add_startup_system(setup.system())
 | |
|         .run();
 | |
| }
 | |
| 
 | |
| fn setup(
 | |
|     asset_server: Res<AssetServer>,
 | |
|     mut data1s: ResMut<Assets<MyCustomData>>,
 | |
|     mut data2s: ResMut<Assets<MySecondCustomData>>,
 | |
| ) {
 | |
|     let data1_handle = asset_server
 | |
|         .load_sync(&mut data1s, "assets/data/test_data.data1")
 | |
|         .unwrap();
 | |
|     let data2_handle = asset_server
 | |
|         .load_sync(&mut data2s, "assets/data/test_data.data2")
 | |
|         .unwrap();
 | |
| 
 | |
|     let data1 = data1s.get(&data1_handle).unwrap();
 | |
|     println!("Data 1 loaded with value {}", data1.num);
 | |
| 
 | |
|     let data2 = data2s.get(&data2_handle).unwrap();
 | |
|     println!("Data 2 loaded with value {}", data2.is_set);
 | |
| }
 | 
