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

原始代码

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

cpp 复制代码
// 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 tooltip
            NewTooltipVisualizer = CurWidget;
            break;
        }
    }
}

修改后的代码

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

cpp 复制代码
// 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 tooltip
            NewTooltipVisualizer = CurWidget;
            break;
        }
    }
#else
    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 tooltip
            NewTooltipVisualizer = CurWidget;
            break;
        }
    }
#endif
}

主要原因

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

解决的办法

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

相关推荐
牙膏上的小苏打23335 小时前
Unity Surround开关后导致获取主显示器分辨率错误
unity·主屏幕
Unity大海7 小时前
诠视科技Unity SDK开发环境配置、项目设置、apk打包。
科技·unity·游戏引擎
浅陌sss12 小时前
Unity中 粒子系统使用整理(一)
unity·游戏引擎
维度攻城狮17 小时前
实现在Unity3D中仿真汽车,而且还能使用ros2控制
python·unity·docker·汽车·ros2·rviz2
为你写首诗ge20 小时前
【Unity网络编程知识】FTP学习
网络·unity
神码编程1 天前
【Unity】 HTFramework框架(六十四)SaveDataRuntime运行时保存组件参数、预制体
unity·编辑器·游戏引擎
菲fay1 天前
Unity 单例模式写法
unity·单例模式
火一线1 天前
【Framework-Client系列】UIGenerate介绍
游戏·unity
ZKY_241 天前
【工具】Json在线解析工具
unity·json
ZKY_242 天前
【Unity】处理文字显示不全的问题
unity·游戏引擎