我对事件调度员有疑问。我在我的代码中创建了调度程序,如下所示:
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)
这是为了在每次暂停/取消暂停我的蓝图音频时播放值,然后执行更多代码逻辑,具体取决于 广播价值。
所以我假设你试着:
我的主张是使用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
的实现:
让AudioPauseEvent
让您通知其他游戏对象。以下示例显示如何在级别蓝图中订阅暂停更改:
您还可以从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