欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > UE小:UE5的Pixelstreaming在捕获画面的时候没办法显示非Viewport的Slate区域按钮的ToolTip

UE小:UE5的Pixelstreaming在捕获画面的时候没办法显示非Viewport的Slate区域按钮的ToolTip

2024/10/23 15:37:24 来源:https://blog.csdn.net/zx1091515459/article/details/142917127  浏览:    关键词:UE小:UE5的Pixelstreaming在捕获画面的时候没办法显示非Viewport的Slate区域按钮的ToolTip

原始代码

首先,让我们看看原始代码片段:

// Some widgets might want to provide an alternative Tooltip Handler.
if (bCanSpawnNewTooltip || !NewTooltip)
{TSharedPtr<SWidget> NewTooltipWidget = NewTooltip ? NewTooltip->AsWidget() : TSharedPtr<SWidget>();for (int32 WidgetIndex = WidgetsToQueryForTooltip.Widgets.Num() - 1; WidgetIndex >= 0; --WidgetIndex){const TSharedRef<SWidget>& CurWidget = WidgetsToQueryForTooltip.Widgets[WidgetIndex].Widget;if (CurWidget->OnVisualizeTooltip(NewTooltipWidget)){// Someone is taking care of visualizing this tooltipNewTooltipVisualizer = CurWidget;break;}}
}

修改后的代码

现在,我们来看一下修改后的版本:

// Some widgets might want to provide an alternative Tooltip Handler.
if (bCanSpawnNewTooltip || !NewTooltip)
{TSharedPtr<SWidget> NewTooltipWidget = NewTooltip ? NewTooltip->AsWidget() : TSharedPtr<SWidget>();
#if (UE_BUILD_SHIPPING || UE_BUILD_DEBUG)FVector2D WindowInitialDesiredSize =  SlateApp.GetTopLevelWindows()[0]->GetInitialDesiredSizeInScreen();FVector2D  ViewportSize = SlateApp.GetTopLevelWindows()[0]->GetViewport()->GetSize();FWidgetPath WidgetsUnderCursor = SlateApp.LocateWindowUnderMouse(FVector2D (ViewportSize.X-170,63), SlateApp.GetInteractiveTopLevelWindows(), /*bIgnoreEnabledStatus =*/true, UserIndex);for (int32 WidgetIndex = WidgetsUnderCursor.Widgets.Num() - 1; WidgetIndex >= 0; --WidgetIndex){const TSharedRef<SWidget>& CurWidget = WidgetsUnderCursor.Widgets[WidgetIndex].Widget;if (CurWidget->OnVisualizeTooltip(NewTooltipWidget)){// Someone is taking care of visualizing this tooltipNewTooltipVisualizer = CurWidget;break;}}
#elsefor (int32 WidgetIndex = WidgetsToQueryForTooltip.Widgets.Num() - 1; WidgetIndex >= 0; --WidgetIndex){const TSharedRef<SWidget>& CurWidget = WidgetsToQueryForTooltip.Widgets[WidgetIndex].Widget;if (CurWidget->OnVisualizeTooltip(NewTooltipWidget)){// Someone is taking care of visualizing this tooltipNewTooltipVisualizer = CurWidget;break;}}
#endif
}

主要原因

主要看当前的要显示ToolTip的区域是否有一个SVirtualWindow,如果有就将ToolTip显示在SVirtualWindow之内就行,否则的话NewTooltipVisualizer将不会赋值,导致的后果就是他会新生成一个SWindow,独立于Pixelstreaming的TargetWindow,而Pixelstreaming只捕获TargetWindow画面,所以导致看到的画面中没有ToolTip并且伴随着闪烁,如果显卡能力稍弱一点可能会导致崩溃

image.png

image.png

解决的办法

就是将调用显示ToolTip的逻辑中插入每次都检测一个固定位置,这个固定位置是一定包含SVirtualWindow的就行(比如我就是将WidgetsToQueryForTooltip替换为了我自己通过位置检测的位置获得的FWidgetPath,这个位置是在Viewport中放置的一个按钮)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com