Questions et réponses de la communauté

Bienvenue sur le forum de questions et réponses d'Audiokinetic, propulsé par la communauté. C'est l'endroit où les utilisateurs de Wwise et Strata s'entraident. Pour obtenir une aide directe de notre équipe, veuillez utiliser la page « Tickets de soutien ». Pour signaler un bug, utilisez l'option Bug Report dans l'Audiokinetic Launcher. (Veuillez noter que les rapports de bug soumis au forum questions-réponses seront rejetés. L'utilisation de notre système de rapport de bug dédié garantit que votre rapport est vu par les bonnes personnes et a les meilleures chances d'être corrigé.)

Pour obtenir rapidement les meilleures réponses, suivez ces conseils lorsque vous posez une question :

  • Soyez précis : qu'essayez-vous de réaliser ou quel est le problème spécifique que vous rencontrez ?
  • Pensez à inclure les détails importants : incluez des détails tels que les versions de Wwise et du moteur de jeu, le système d'exploitation, etc.
  • Expliquez ce que vous avez essayé de faire : indiquez aux autres les mesures que vous avez déjà prises pour essayer de résoudre le problème.
  • Concentrez-vous sur les faits : décrivez les aspects techniques de votre problème. Se concentrer sur le problème aide les autres personnes à trouver rapidement une solution.

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!

 

dans General Discussion par James M. (800 points)

1 Réponse

+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.
par Lisbeth R. (250 points)
edité par 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
...