커뮤니티 Q&A

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

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

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

+3 투표
I have recently updated to the latest Wwise and Unreal Engine versions. What I noticed is that my "PostEvent" functions were now throwing errors, because they no longer require two parameters. One of the new parameters is a reference to a struct of type "FOnAkPostEventCallback", for which visual studio says that the declaration is undefined. So what exactly am I supposed to pass into this function? Would highly appreciate a descriptive response!
General Discussion Marc B. (130 포인트) 로 부터
Ditto. Please advise. In addition, please implement a deprecation/change strategy for the Ak UE4 plugin code.

PostAkEvent() is a UFunction, and deprecation metadata can be added to the UFUNCTION attribute. Perhaps with a deprecation message like, 'PostAkEventDEPRECATED() will be removed in Wwise [major.minor]. Please convert caller to use the updated PostAkEvent().', etc.

Due to limitations with UHT, we can't have UFUNCTION overloads, so perhaps AkComponent::PostAkEvent(...) could have been copied to a PostAkEventDEPRECATED(...), so that callers would at least have a way to unblock in the short term.

UFunctions
https://docs.unrealengine.com/en-us/Programming/UnrealArchitecture/Reference/Functions


FWIW: On the Unity side, they respect System.ObsoleteAttribute.


- thanks
I would also like to know this. Please could we get an official response for how to do this in C++.

3 답변

–2 투표

Marc B., look at AkComponent.cpp for a workaround...

if you need to call a Blueprint function, you can use PostAkEventByName(), which calls PostAkEventByNameWithCallback() with the appropriate default/null args...
int32 UAkComponent::PostAkEventByName(const FString& in_EventName)

From cpp, you can call PostAkEventByNameWithCallback directly with the default/null args specified here in comments, if you want...
AkPlayingID UAkComponent::PostAkEventByNameWithCallback(const FString& in_EventName, AkUInt32 in_uFlags /*= 0*/, AkCallbackFunc in_pfnUserCallback /*= NULL*/, void * in_pUserCookie /*= NULL*/)

Whatever works for you. All roads eventually lead to AudioDevice->PostEvent().

- cheers

Paul B. (160 포인트) 로 부터
–1 투표

Though this question is asked at years ago, but for anyone in the future who steps into this QA.

Got me confused today too, but finally I noticed that the "FOnAkPostEventCallback" is a delegation's name, and it is defined in AkGameplayTypes.h (my Wwise SDK version is 2019.1.9.7221). The UE4 Delegate could be used like a class or struct, but the compiler won't find its reference or implement when it's used in another .h file... Here's the definition copied from AkGameplayTypes.h:

DECLARE_DYNAMIC_DELEGATE_TwoParams(FOnAkPostEventCallback, EAkCallbackType, CallbackType, UAkCallbackInfo*, CallbackInfo);

军懿 (160 포인트) 로 부터
수정 军懿 로 부터
0 투표

Let me give u an example. It just cost me lots of time to find a way to make my c++ callback work just like BP:

(Be careful about the event mask, u should set it to the event type u want to listen, set to 0 will miss all events. And also have a notice on the UFUNCTION macro of the callback, it's for dynamic delegate.)

class ATest : public AActor
{
public:
    FOnAkPostEventCallback OnAkPostEventDelegate;

    virtual void BeginPlay() override;
    virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
    
    UFUNCTION()
    void OnAkPostEventCallback(EAkCallbackType CallbackType, UAkCallbackInfo* CallbackInfo);

    void LetWwiseSpeakSomething(AActor* Actor, UAkAudioEvent* AkEvent);
};

void ATest::BeginPlay()
{
    OnAkPostEventDelegate.BindDynamic(this, &ATest::OnAkPostEventCallback);
    
    // other codes;
}

void ATest::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
    OnAkPostEventDelegate.Clear();
    // other codes;
}


inline void ATest::LetWwiseSpeakSomething(AActor* Actor, UAkAudioEvent* AkEvent)
{
    UAkGameplayStatics::PostEvent(AkEvent, Actor, AK_EndOfEvent, OnAkPostEventDelegate);
}
Yuju S. (150 포인트) 로 부터
...