我目前正致力于处理播放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是错误吗?
答案 0 :(得分:0)
CreateSound2D
时, bAutoDestroy
将true
设置为AudioComponent
。
您可以在函数中将其设置为false
,以避免它被破坏。
您可能还想查看AudioComponent.h
中列出的其他选项。