2017-04-24 2 views
0

OnAudioFinished 대리인을 바인딩하는 데 문제가 있습니다.언리얼 엔진이 AddDynamic과 충돌합니다.

잠시 동안 검색했지만 아직 답변을 찾을 수 없습니다. 나는 이것을 따라 갔다 answer!

내 코드는하지만 내 프로젝트는이 오류와 충돌로드 할 때, 전혀 오류없이 컴파일 :

UE4Editor_!TBaseDynamicMulticastDelegate<FWeakObjectPtr,void>::__Internal_AddDynamic<UAudioController>() [d:\path\delegates\delegatesignatureimpl.inl:1140] 
UE4Editor_Project!UAudioController::UAudioController() [d:\path\private\audiocontroller.cpp:17] 
UE4Editor_Project!InternalConstructor<UAudioController>() 

는 내가 이해 할 것은 그 생성자 내 엔진을 분쇄,하지만 난 이유를 모르겠어 그런 일이 일어나고 있습니다. 이 바인딩을 담당하는 코드는 다음과 같습니다.

.H

static UAudioComponent* AudioComponent; 

public: 
    UAudioController(); 


void SoundFinished(); 

통화 당 UE에서

UAudioController::UAudioController() 
{ 
    AudioComponent->OnAudioFinished.AddDynamic(this, &UAudioController::SoundFinished); 

} 

void UAudioController::SoundFinished() 
{ 
    GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Red, TEXT("Audio Finished trigger")); 
} 
+3

디버거가 이와 같은 문제에 대해 가장 친한 친구가 될 것입니다. 즉, AddDynamic을 호출 할 때 AudioComponent가 아직 초기화되지 않은 것 같습니다. – Sneftel

+1

또한'SoundFinished' 함수가 UFUNCTION인지 확인하십시오. – JKovalsky

+0

편집 된 답변을 확인하십시오. 'NewObject <...>()'(아래의 주석에서 언급했듯이)을 사용하는 것은 분명히 구성 요소로 작업하는 올바른 방법이 아닙니다. –

답변

1

, 속성이 제대로 생성자 실행 중에 초기화되지 않습니다. 그들은 PostInitProperties이 호출 될 때입니다 (CDO에서로드 한 후).

정적 클래스가 필요한지 스스로에게 질문해야합니다. 싱글 톤이 필요하면 GameInstance에 저장할 수 있습니다. 특히 UE 환경에서 더 안전합니다 (정적 UPROPERTY() 필드 등을 가질 수 없음)

BeginPlay 동안이 이벤트를 바인딩하는 것으로 충분하다고 생각합니다.

// AudioController.h 
virtual void BeginPlay() override; 
virtual void EndPlay(const EEndPlayReason::Type EndPlayReasonType) override; 

// AudioController.cpp 
void UAudioController::BeginPlay() { 
    Super::BeginPlay(); 
    AudioComponent->OnAudioFinished.AddDynamic(this, &UAudioController::SoundFinished); 
} 

void UAudioController::EndPlay(const EEndPlayReason::Type EndPlayReasonType) { 
    AudioComponent->OnAudioFinished.RemoveDynamic(this, &UAudioController::SoundFinished); 
    Super::EndPlay(EndPlayReasonType); 
} 

편집 바인딩 동적를 사용하는 경우 necesarry 아니지만 제거가 좋습니다 : 당신이 컨트롤러 접미사 클래스 이름 때문에,이 레벨에서이 배우의 싱글 선두로부터 될 것이라고 가정한다. 그래서 당신은 정적 포인터를 할 필요가 없습니다 (그것은 파괴 얻을 수 - 다시,이 UE 전문이다), 단순히 컨트롤러에 공공 회원으로 AudioComponent을 가지고 올바르게 다음

// AudioController.h 
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "My Audio Conmponent", meta = (AllowPrivateAccess = "true")) 
    UAudioComponent* AudioComponent; 

및 생성자에서 초기화 :

UAudioController::UAudioController() 
    : Super() 
{ 
    AudioComponent = CreateDefaultSubobject<UAudioComponent>(TEXT("MyAudioComponent")); 
} 

또는

UAudioController::UAudioController(const class FObjectInitializer& ObjectInitializer) 
    : Super(ObjectInitializer) 
{ 
    AudioComponent = CreateDefaultSubobject<UAudioComponent>(TEXT("MyAudioComponent")); 
} 

구성 요소가됩니다 제대로 생성되고 바인드 된 함수가 예상대로 실행됩니다. @JKovalsky 언급했듯이 동적 대리자를 사용할 때

또한 해당 SoundFinishedUFUNCTION() 매크로 방법으로 표시되어야한다.

+0

지금 테스트 해보고 피드백을 보내 드리겠습니다. : 3 큰 반응을 가져 주셔서 감사합니다. –

+0

입력 한 가상 기능이 작동하지 않는 것 같습니다. 그들은 다음 오류를 생성합니다 : 'class "UObject"멤버가 없습니다 "BeginPlay" "override"가있는 멤버 함수는 Actor.h를 포함하여 나를 이끌어 낸 솔루션을 찾고있었습니다. 그것은 아무것도 바뀌지 않았습니다. 그들 없이는 문제없이 컴파일되었지만, 생성자에서 바인드 된 경우에도이 SoundFinished가 실행되지 않습니다. 내 기본 클래스가 UObject 형식을 상속합니다 –

+1

@AdrianRozlach'UAudioController'의 기본 개체는 무엇입니까? 나는 그것이'AActor'라고 가정했으나'UObject'로부터 직접 상속받은 것처럼 보입니다 ... 후자라면 어떤 이유가 있습니까? –

관련 문제