避免在暂停时破坏声音

时间:2018-05-25 11:06:42

标签: c++ unreal-engine4

我目前正致力于处理播放npc引号并向其显示字幕的对话系统。我遇到引擎破坏暂停声音的问题。

它看起来如何:

所以我创建了创建声音的函数,它看起来像这样:

UAudioComponent* UAudioController::Sound2D(UObject* WorldContextObject, class USoundBase* Sound, float VolumeMultiplier, float PitchMultiplier, float StartTime)
{
    if (!Sound)
    {
        return nullptr;
    }

    UAudioComponent* AudioComponent = UGameplayStatics::CreateSound2D(WorldContextObject, Sound, VolumeMultiplier, PitchMultiplier, StartTime);
    AudioComponent->bIsUISound = false;
    PlaybackPositionMap.Add(AudioComponent, 0.f);
    BindDelegates(AudioComponent);
    AudioComponent->Play(StartTime);
    return AudioComponent;
}

正如您所看到的,PlaybackPositionMap基本上是带有UAudioComponent和float的TMap。我用它来跟踪播放的时间。还有一个名为BindDelegates()的函数,如下所示:

void UAudioController::BindDelegates(UAudioComponent* AudioComponent)
{
    if (AudioComponent->IsValidLowLevel())
    {
        AudioComponent->OnAudioPlaybackPercent.AddDynamic(this, &UAudioController::SavePlaybackPosition);
        AudioComponent->OnAudioFinished.AddDynamic(this, &UAudioController::SoundFinished);
    }
}

AudioPlaybackPercent的第一次绑定只测量播放的时间并将其保存在我的地图中。第二次绑定告诉我声音已经完成播放,这对我来说很重要,这是我问题的根源。

问题: 当我在蓝图中使用SetPaused节点一段时间后,即使没有,我也会收到消息说我的声音已经播放完毕。我检查了它,AudioComponent刚刚被销毁。我试过这样做:

AudioComponent->AddToRoot();

但它让我的编辑崩溃了。有没有其他方法可以接近它?使用CreateSound2D是错误吗?

1 个答案:

答案 0 :(得分:0)

在创建CreateSound2D时,

bAutoDestroytrue设置为AudioComponent
您可以在函数中将其设置为false,以避免它被破坏。

您可能还想查看AudioComponent.h中列出的其他选项。