事件调度程序调用代码函数

时间:2017-05-19 13:23:03

标签: c++ event-handling unreal-engine4

我对事件调度员有疑问。我在我的代码中创建了调度程序,如下所示:

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

2 个答案:

答案 0 :(得分:1)

  

这是为了在每次暂停/取消暂停我的蓝图音频时播放值,然后执行更多代码逻辑,具体取决于   广播价值。

所以我假设你试着:

  1. 通知游戏中的其他对象,音频播放状态已更改
  2. 为音频控制器中的播放更改提供C ++和Blueprint实现
  3. 我的主张是使用BlueprintNativeEvent创建回放更改的内部UAudioController实现。 Base 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 );
    }
    

    实现首先被定义为C ++代码,它也用AudioPauseEvent函数激活Broadcast

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

    然后可以在从OnSoundPaused派生的Bluepint中覆盖UAudioController的实现:

    enter image description here

    AudioPauseEvent让您通知其他游戏对象。以下示例显示如何在级别蓝图中订阅暂停更改:

    enter image description here

    您还可以从C ++订阅此事件的其他对象(例如UAudioListener):

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

答案 1 :(得分:0)

您需要另一个名为BlueprintImplementableEvent的UPROPERTY,这可以让您定义一个可以被Blueprint覆盖的代码函数。见https://answers.unrealengine.com/questions/38960/blueprintimplementableevent-in-level-blueprint.html