Community Q&A

Welcome to Audiokinetic’s community-driven Q&A forum. This is the place where Wwise and Strata users help each other out. For direct help from our team, please use the Support Tickets page. To report a bug, use the Bug Report option in the Audiokinetic Launcher. (Note that Bug Reports submitted to the Q&A forum will be rejected. Using our dedicated Bug Report system ensures your report is seen by the right people and has the best chance of being fixed.)

To get the best answers quickly, follow these tips when posting a question:

  • Be Specific: What are you trying to achieve, or what specific issue are you running into?
  • Include Key Details: Include details like your Wwise and game engine versions, operating system, etc.
  • Explain What You've Tried: Let others know what troubleshooting steps you've already taken.
  • Focus on the Facts: Describe the technical facts of your issue. Focusing on the problem helps others find a solution quickly.

0 votes

There is a flying insect in my game that, when it spawns, begins emitting a looping sound.

When the bug is supposed to die, I post the Wwise event that stops its looping sound, and then call Destroy(gameObject) as the next line of code.

When I do this, I get this error: Wwise: Unknown game object ID. Make sure the game object is registered before using it and do not use it once it was unregistered.: 1

How can I stop the looping sound being emitted from that gameobject, and destroy the gameobject on the same frame? I've been using Wwise for over a year now and I'm surprised that this is an issue and that I didn't run into this issue until now.

Thanks a lot for any help!

 

in General Discussion by James M. (800 points)

1 Answer

+1 vote
As I recall it, the execution order of script is such that wwise executes after normal unity code, meaning, that even if you write it like

-stop sound

-destroy object

the -stop sound- runs after the object gets destroyed even if you did not write it like that.

I can't recall what the syntax is named, but I'm pretty sure I recall that there is a tool in the API for executing wwise commands instantly, if you really wish to have it all in the same frame, and not just waiting for the next frame, before destroying the object.
by Lisbeth R. (250 points)
edited by Lisbeth R.
Thanks, yeah that does appear to be how it works - I think the audio stuff may be running in a separate thread, so I suppose it makes sense that my commands might get queued up and then executed later.

But even if this was the case, why does it know that the gameobject is destroyed BEFORE it executes my Stop command? Just seems strange.

I also tried the 'wait until next frame before destroying object' approach, and it did not work (same error). If I wait longer (like 0.1s), it did work, so that is what I'm doing right now (disabling the gameobject, stopping the sound, waiting 0.1s, then destroying). It feels pretty janky to do it that way, so I'm not super happy about it and would love for a cleaner way to do this.
I'm pretty sure Wwise simply check whether the object is there or not, before it tries to execute its code. Just like a regular Null error from C# when something is not there, but was supposed to be there. In any case, you can try to unregister the object such that the code would look something like:

AkSoundEngine.StopAll (gameObject);
AkSoundEngine.UnregisterGameObj(gameObject);
StartCoroutine(Wait);

Ienumerator Wait(){
   yield return null
   Destroy(gameobject);
}

Also, I checked up on when the different things are running, and it goes something like:

start of a frame:
your C# script runs
then the graphics are rendered

End of frame:
wwise code runs
...