2017-05-19 2 views
1

Ich habe eine Frage zu Event-Dispatcher. Ich habe Dispatcher in meinem Code wie folgt erstellt:Event Dispatcher Aufruf Code-Funktion

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoundPausedDelegate, bool, isSoundPaused); 

UPROPERTY(BlueprintAssignable) 
     FSoundPausedDelegate AudioPause; 

Dies funktioniert einwandfrei in Blueprints. Aber ich weiß nicht wirklich, wie kann ich es machen, um Funktion in Code aufzurufen?

Ich denke, es etwas sein wird mit:

AudioPause.AddDynamic(this, &UAudioController::OnDelegateBroadcast); 

Was soll ich es binden? Das bedeutet, dass jedes Mal, wenn ich meine Audiodaten im Blueprint pausiere oder wieder aufhalte, Werte gesendet werden und dann je nach übertragenem Wert mehr Code-Logik ausgeführt wird. Diese

ist, wie meine Funktion wie folgt aussieht:

void UAudioController::OnDelegateBroadcast(bool SoundPaused) 
{ 
    if (SoundPaused == true) 
    { 
     SoundPause = true; 
     GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("True")); 
    } 
    else 
    { 
     SoundPause = false; 
     GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("False")); 
    } 
} 

Antwort

0

Dies sollte jedes Mal ausgestrahlt Wert i mein Audio in Bauplan Pause/unpause und dann mehr Codelogik ausführen je nach ausgestrahlt Wert. So

Ich nehme an, Sie versuchen zu:

  1. andere Objekte im Spiel Inform, dass Audio-Wiedergabe Zustand geändert wird
  2. Geben Sie C++ und Blueprint-Implementierung für die Wiedergabe Änderung Ihrer Audio-Controller

Mein Vorschlag ist es, innere UAudioController Implementierung der Wiedergabe Änderung mit BlueprintNativeEvent zu erstellen. Die Basis-C++ - Implementierung verwendet Ihren Dispatcher, um Benachrichtigungen an andere Spielobjekte zu übermitteln.

Dies ist die Klasse .h-Datei in Kürze.

 
    DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoundPausedDelegate, bool, isSoundPaused); 

    ... 

    //Convenient Play/Pause function for blueprint 
    UFUNCTION(BlueprintCallable, Category="Example") 
    void Play(); 

    UFUNCTION(BlueprintCallable, Category="Example") 
    void Pause(); 

    //Implementation for pause state change 
    UFUNCTION(BlueprintNativeEvent, Category="Example") 
    void OnSoundPaused(bool paused); 
    void OnSoundPaused_Implementation(bool paused); 

    ... 

    //event dispatcher 
    UPROPERTY(VisibleAnywhere, BlueprintAssignable) 
    FSoundPausedDelegate AudioPauseEvent; 

Praktische Funktionen einfach Implementierung aufrufen:

void UAudioController::Play() 
{ 
    OnSoundPaused(false); 
} 


void UAudioController::Pause() 
{ 
    OnSoundPaused(true); 
} 

Implementierung definiert wird zunächst als C++ Code, der auch AudioPauseEvent mit Broadcast Funktion Feuer:

void UAudioController::OnSoundPaused_Implementation(bool paused) 
{ 
    if(paused == true) 
    { 
     SoundPause = true; 
     GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("True")); 
     // more logic... 
    } 
    else 
    { 
     SoundPause = false; 
     GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("False")); 
     // more logic... 
    } 

    AudioPauseEvent.Broadcast(SoundPause); 
} 

Implementierung von OnSoundPaused könnte dann außer Kraft gesetzt in Bluepint abgeleitet von UAudioController:

enter image description here

Mit AudioPauseEvent können Sie andere Spielobjekte benachrichtigen.Beispiel unten zeigen, wie für Pause Pegeländerung Plan abonnieren:

enter image description here

Sie auch andere Objekte zeichnen könnten (zum Beispiel UAudioListener) von C++ für diese Veranstaltung:

void UAudioListener::StartListeningForAudioPause() 
{ 
    // UAudioListener::OnAudioPause should be UFUNCTION 
    AudioControllerPtr->AudioPauseEvent.AddDynamic(this, &UAudioListener::OnAudioPause); 
} 
+0

Das ist wirklich für war hilfsbereit mich! Funktioniert wie Charme, gut zu sehen Antwort so tief erklärt! Vielen Dank: 3 – Avengar