2017-05-19 4 views
1

イベントディスパッチャーに関する質問があります。私はこのように自分のコードでディスパッチャを作成しました:イベントディスパッチャー呼び出しコード関数

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoundPausedDelegate, bool, isSoundPaused); 

UPROPERTY(BlueprintAssignable) 
     FSoundPausedDelegate AudioPause; 

これは青写真で完璧に動作します。しかし、私は本当に知らない、どのようにコード内の関数を呼び出すことができますか?

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

私はそれをバインドしなければならない。

は、私はで何かをするつもりだと思いますか?これは、青写真でオーディオを一時停止/一時停止解除し、ブロードキャストされた値に応じてより多くのコードロジックを実行するたびに、値をブロードキャストするためのものです。

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")); 
    } 
} 

答えて

0

を参照してください。これは、値私は/一時停止青写真で私のオーディオの一時停止を解除してから 放送さ値に応じてより多くのコードのロジックを実行するたびに放送するためのものです。

だから私は、あなたがしようと仮定します。

  1. オーディオ再生状態が
  2. を変更していることを、ゲーム内の他のオブジェクトに通知し、オーディオコントローラ
の再生の変化のためにC++と青写真の実装を提供します

私の提案は、内部のUAudioControllerの再生変更の実装をBlueprintNativeEventを使用して作成することです。ベースC++の実装では、ディスパッチャを使用して他のゲームオブジェクトに通知を伝播します。

これは、クラス.hファイルです。

 
    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; 

便利な機能は、単に実装を呼び出す:

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


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

実装もBroadcast機能をAudioPauseEventを発射C++コード、として最初に定義される:OnSoundPaused

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); 
} 

実装は、次にオーバーライドすることができUAudioControllerから派生したBluepint:

enter image description here

AudioPauseEventあなたは他のゲームオブジェクトに通知することができます。

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

本当にために参考になった:また、このイベントのためにC++から(たとえばUAudioListener用)他のオブジェクトを購読することができ

enter image description here

:レベルの青写真で、ポーズの変更のためにサブスクライブする方法を示し、以下の実施例私!魅力のように働き、答えがとても深く説明されているのを見てよかった!ありがとうございます:3 – Avengar