C++ 事件调度器调用代码函数

C++ 事件调度器调用代码函数,c++,event-handling,unreal-engine4,C++,Event Handling,Unreal Engine4,我有一个关于事件调度员的问题。我在代码中创建了dispatcher,如下所示: DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoundPausedDelegate, bool, isSoundPaused); UPROPERTY(BlueprintAssignable) FSoundPausedDelegate AudioPause; 这在蓝图中非常有效。但我真的不知道,我怎样才能在代码中调用函数呢 我想应该是这样的: Audio

我有一个关于事件调度员的问题。我在代码中创建了dispatcher,如下所示:

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoundPausedDelegate, bool, isSoundPaused);

UPROPERTY(BlueprintAssignable)
        FSoundPausedDelegate AudioPause;
这在蓝图中非常有效。但我真的不知道,我怎样才能在代码中调用函数呢

我想应该是这样的:

AudioPause.AddDynamic(this, &UAudioController::OnDelegateBroadcast);
我该把它绑在什么上?这意味着每次我在blueprint中暂停/取消暂停音频时都要广播值,然后根据广播值执行更多的代码逻辑

我的函数是这样的:

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

您需要另一个名为BlueprintImplementableEvent的Upperty,它允许您定义一个可以被Blueprint覆盖的代码函数。看

这意味着每次我在blueprint中暂停/取消暂停音频时都要广播值,然后根据需要执行更多代码逻辑 广播价值

因此,我假设您尝试:

  • 通知游戏中的其他对象,音频播放状态已更改
  • 为音频控制器
  • 中的播放更改提供C++和蓝图实现 我的建议是使用创建播放更改的内部
    UAudioController
    实现。Basic C++实现将使用调度器将通知传播到其他游戏对象。 简而言之,这是class.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++代码,它还使用<代码>广播< <代码>函数:<代码> > AudioAuthEngult<代码>:

    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中重写
    OnSoundPaused
    的实现:

    使用
    AudioPauseEvent
    可以通知其他游戏对象。下面的示例显示如何订阅标高蓝图中的暂停更改:

    您还可以从C++中订阅其他对象(例如,代码> UdioOististNe/Cuff>):

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

    这对我真的很有帮助!作品很有魅力,很高兴看到答案如此深刻的解释!非常感谢:3