@@ -651,7 +651,7 @@ impl AssetServer {
651651 } ;
652652
653653 let nested_direct_loaded_assets = RwLock :: new ( NestedAssets :: default ( ) ) ;
654- match self
654+ let result = match self
655655 . load_with_meta_loader_and_reader (
656656 & base_path,
657657 meta. as_ref ( ) ,
@@ -686,7 +686,7 @@ impl AssetServer {
686686 handle. unwrap ( )
687687 } ;
688688
689- self . send_loaded_asset ( base_handle. id ( ) , loaded_asset) ;
689+ self . send_loaded_asset ( Some ( base_handle. id ( ) ) , loaded_asset) ;
690690 Ok ( final_handle)
691691 }
692692 Err ( err) => {
@@ -697,23 +697,44 @@ impl AssetServer {
697697 } ) ;
698698 Err ( err)
699699 }
700+ } ;
701+
702+ // Even if the asset failed to load, the nested assets still loaded correctly, so we might
703+ // as well send those assets to "refresh" them.
704+ for ( path, asset) in nested_direct_loaded_assets. into_inner ( ) . 0 {
705+ // Even if the handle is None, one of its subassets may be loaded, so we should send the
706+ // whole complete asset.
707+ let handle = self
708+ . data
709+ . infos
710+ . read ( )
711+ . get_path_and_type_id_handle ( & path, asset. asset . asset_type_id ( ) ) ;
712+ self . send_loaded_asset ( handle. map ( |handle| handle. id ( ) ) , asset) ;
700713 }
714+
715+ result
701716 }
702717
703718 /// Sends a load event for the given `loaded_asset` and does the same recursively for all
704719 /// labeled assets.
705- fn send_loaded_asset ( & self , id : UntypedAssetId , mut complete_asset : CompleteErasedLoadedAsset ) {
720+ fn send_loaded_asset (
721+ & self ,
722+ id : Option < UntypedAssetId > ,
723+ mut complete_asset : CompleteErasedLoadedAsset ,
724+ ) {
706725 for ( _, labeled_asset) in complete_asset. labeled_assets . drain ( ) {
707726 self . send_asset_event ( InternalAssetEvent :: Loaded {
708727 id : labeled_asset. handle . id ( ) ,
709728 loaded_asset : labeled_asset. asset ,
710729 } ) ;
711730 }
712731
713- self . send_asset_event ( InternalAssetEvent :: Loaded {
714- id,
715- loaded_asset : complete_asset. asset ,
716- } ) ;
732+ if let Some ( id) = id {
733+ self . send_asset_event ( InternalAssetEvent :: Loaded {
734+ id,
735+ loaded_asset : complete_asset. asset ,
736+ } ) ;
737+ }
717738 }
718739
719740 /// Kicks off a reload of the asset stored at the given path. This will only reload the asset if it currently loaded.
0 commit comments