커뮤니티 Q&A

Audiokinetic의 커뮤니티 Q&A 포럼에 오신 것을 환영합니다. 이 포럼은 Wwise와 Strata 사용자들이 서로 도움을 주는 곳입니다. Audiokinetic의 직접적인 도움을 얻으려면 지원 티켓 페이지를 사용하세요. 버그를 보고하려면 Audiokinetic 런처에서 Bug Report 옵션을 사용하세요. (Q&A 포럼에 제출된 버그 보고는 거절됩니다. 전용 Bug Report 시스템을 사용하면 보고 내용이 담당자에게 정확히 전달되어 문제 해결 가능성이 크게 높아집니다.)<segment 6493>

빠르고 정확한 답변을 얻으려면 질문을 올릴 때 다음 팁을 참고하세요.

  • 구체적인 내용을 적어주세요: 무엇을 하려는지, 혹은 어떤 특정 문제에 부딪혔는지 설명하세요.
  • 핵심 정보를 포함하세요: Wwise와 게임 엔진 버전, 운영체제 등 관련 정보를 함께 제공하세요.
  • 시도한 방법들을 알려주세요: 문제 해결을 위해 이미 어떤 단계를 시도해봤는지 설명해주세요.
  • 객관적인 사실에 초점을 맞추세요: 문제의 기술적 사실을 중심으로 설명하세요. 문제에 집중할수록 다른 사람들이 더 빠르게 해결책을 찾을 수 있습니다.

0 투표

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!

 

General Discussion James M. (800 포인트) 로 부터

1 답변

+1 투표
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.
Lisbeth R. (250 포인트) 로 부터
수정 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
...