1- use bevy:: app:: PreStartup ;
1+ use bevy:: ecs:: error:: Result ;
2+ use bevy:: ecs:: lifecycle:: Remove ;
3+ use bevy:: ecs:: observer:: On ;
4+ use bevy:: ecs:: system:: Query ;
25use bevy:: log:: error;
3- use bevy:: prelude:: { App , Plugin , PostUpdate , Res , Update , World } ;
6+ use bevy:: prelude:: { App , Plugin , PostUpdate , Res , Update } ;
47
58use crate :: components:: audio_listener:: AudioListener ;
69use crate :: components:: audio_source:: AudioSource ;
@@ -21,15 +24,15 @@ impl Plugin for FmodPlugin {
2124 fn build ( & self , app : & mut App ) {
2225 app. add_plugins ( VelocityPlugin )
2326 . insert_resource ( FmodStudio :: new ( self . audio_banks_paths , self . plugin_paths ) )
24- . add_systems ( PreStartup , register_component_hooks)
2527 . add_systems (
2628 Update ,
2729 (
2830 AudioSource :: update_3d_attributes,
2931 AudioListener :: update_3d_attributes,
3032 ) ,
3133 )
32- . add_systems ( PostUpdate , Self :: update) ;
34+ . add_systems ( PostUpdate , Self :: update)
35+ . add_observer ( on_remove_audio_source) ;
3336 }
3437}
3538
@@ -49,16 +52,15 @@ impl FmodPlugin {
4952 }
5053}
5154
52- fn register_component_hooks ( world : & mut World ) {
53- world
54- . register_component_hooks :: < AudioSource > ( )
55- . on_remove ( |mut world, hook_context| {
56- let entity = hook_context. entity ;
57- let mut entity_mut = world. entity_mut ( entity) ;
58- let audio_source = entity_mut. get_mut :: < AudioSource > ( ) . unwrap ( ) ;
59- let event_instance = audio_source. event_instance ;
55+ fn on_remove_audio_source (
56+ remove : On < Remove , AudioSource > ,
57+ query : Query < & mut AudioSource > ,
58+ ) -> Result {
59+ let audio_source = query. get ( remove. entity ) ?;
60+ let event_instance = audio_source. event_instance ;
6061
61- event_instance. stop ( audio_source. despawn_stop_mode ) . unwrap ( ) ;
62- event_instance. release ( ) . unwrap ( ) ;
63- } ) ;
62+ event_instance. stop ( audio_source. despawn_stop_mode ) ?;
63+ event_instance. release ( ) ?;
64+
65+ Ok ( ( ) )
6466}
0 commit comments