【问题标题】:Avoid destroying sound when it's paused暂停时避免破坏声音
【发布时间】:2018-05-25 11:06:41
【问题描述】:

我目前正在开发对话系统,该系统将处理播放 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 和浮点数的 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 有错吗?

【问题讨论】:

    标签: c++ unreal-engine4


    【解决方案1】:

    CreateSound2D 在创建AudioComponent 时将bAutoDestroy 设置为true
    您可以在函数中将其设置为 false 以避免它被破坏。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多