@@ -60,9 +60,8 @@ impl InstanceId {
60
60
/// - [`despawn_instance`](Self::despawn_instance)
61
61
#[ derive( Default , Resource ) ]
62
62
pub struct SceneSpawner {
63
- spawned_scenes : HashMap < AssetId < Scene > , Vec < InstanceId > > ,
64
- spawned_dynamic_scenes : HashMap < AssetId < DynamicScene > , Vec < InstanceId > > ,
65
- spawned_instances : HashMap < InstanceId , InstanceInfo > ,
63
+ pub ( crate ) spawned_dynamic_scenes : HashMap < AssetId < DynamicScene > , HashSet < InstanceId > > ,
64
+ pub ( crate ) spawned_instances : HashMap < InstanceId , InstanceInfo > ,
66
65
scene_asset_event_reader : ManualEventReader < AssetEvent < DynamicScene > > ,
67
66
dynamic_scenes_to_spawn : Vec < ( Handle < DynamicScene > , InstanceId ) > ,
68
67
scenes_to_spawn : Vec < ( Handle < Scene > , InstanceId ) > ,
@@ -210,7 +209,7 @@ impl SceneSpawner {
210
209
self . spawned_instances
211
210
. insert ( instance_id, InstanceInfo { entity_map } ) ;
212
211
let spawned = self . spawned_dynamic_scenes . entry ( id) . or_default ( ) ;
213
- spawned. push ( instance_id) ;
212
+ spawned. insert ( instance_id) ;
214
213
Ok ( instance_id)
215
214
}
216
215
@@ -251,8 +250,6 @@ impl SceneSpawner {
251
250
scene. write_to_world_with ( world, & world. resource :: < AppTypeRegistry > ( ) . clone ( ) ) ?;
252
251
253
252
self . spawned_instances . insert ( instance_id, instance_info) ;
254
- let spawned = self . spawned_scenes . entry ( id) . or_default ( ) ;
255
- spawned. push ( instance_id) ;
256
253
Ok ( instance_id)
257
254
} )
258
255
}
@@ -310,8 +307,8 @@ impl SceneSpawner {
310
307
let spawned = self
311
308
. spawned_dynamic_scenes
312
309
. entry ( handle. id ( ) )
313
- . or_insert_with ( Vec :: new) ;
314
- spawned. push ( instance_id) ;
310
+ . or_insert_with ( HashSet :: new) ;
311
+ spawned. insert ( instance_id) ;
315
312
}
316
313
Err ( SceneSpawnError :: NonExistentScene { .. } ) => {
317
314
self . dynamic_scenes_to_spawn . push ( ( handle, instance_id) ) ;
@@ -443,17 +440,14 @@ pub fn scene_spawner_system(world: &mut World) {
443
440
mod tests {
444
441
use bevy_app:: App ;
445
442
use bevy_asset:: { AssetPlugin , AssetServer } ;
446
- use bevy_ecs:: component:: Component ;
447
- use bevy_ecs:: entity:: Entity ;
448
443
use bevy_ecs:: event:: EventReader ;
449
444
use bevy_ecs:: prelude:: ReflectComponent ;
450
445
use bevy_ecs:: query:: With ;
451
- use bevy_ecs:: reflect:: AppTypeRegistry ;
452
446
use bevy_ecs:: system:: { Commands , Res , ResMut , RunSystemOnce } ;
453
- use bevy_ecs:: world :: World ;
447
+ use bevy_ecs:: { component :: Component , system :: Query } ;
454
448
use bevy_reflect:: Reflect ;
455
449
456
- use crate :: { DynamicScene , DynamicSceneBuilder , SceneInstanceReady , ScenePlugin , SceneSpawner } ;
450
+ use crate :: { DynamicSceneBuilder , ScenePlugin } ;
457
451
458
452
use super :: * ;
459
453
@@ -554,4 +548,47 @@ mod tests {
554
548
} ,
555
549
) ;
556
550
}
551
+
552
+ #[ test]
553
+ fn despawn_scene ( ) {
554
+ let mut app = App :: new ( ) ;
555
+ app. add_plugins ( ( AssetPlugin :: default ( ) , ScenePlugin ) ) ;
556
+ app. register_type :: < ComponentA > ( ) ;
557
+
558
+ let asset_server = app. world . resource :: < AssetServer > ( ) ;
559
+
560
+ // Build scene.
561
+ let scene = asset_server. add ( DynamicScene :: default ( ) ) ;
562
+ let count = 10 ;
563
+
564
+ // Checks the number of scene instances stored in `SceneSpawner`.
565
+ let check = |world : & mut World , expected_count : usize | {
566
+ let scene_spawner = world. resource :: < SceneSpawner > ( ) ;
567
+ assert_eq ! (
568
+ scene_spawner. spawned_dynamic_scenes[ & scene. id( ) ] . len( ) ,
569
+ expected_count
570
+ ) ;
571
+ assert_eq ! ( scene_spawner. spawned_instances. len( ) , expected_count) ;
572
+ } ;
573
+
574
+ // Spawn scene.
575
+ for _ in 0 ..count {
576
+ app. world . spawn ( ( ComponentA , scene. clone ( ) ) ) ;
577
+ }
578
+
579
+ app. update ( ) ;
580
+ check ( & mut app. world , count) ;
581
+
582
+ // Despawn scene.
583
+ app. world . run_system_once (
584
+ |mut commands : Commands , query : Query < Entity , With < ComponentA > > | {
585
+ for entity in query. iter ( ) {
586
+ commands. entity ( entity) . despawn_recursive ( ) ;
587
+ }
588
+ } ,
589
+ ) ;
590
+
591
+ app. update ( ) ;
592
+ check ( & mut app. world , 0 ) ;
593
+ }
557
594
}
0 commit comments