Skip to main content

LI PASS 焦点样式设置

概览​

为了保证 LI PASS 界面风格和游戏内界面风格保持一致,LI PASS 默认使用 Unreal Engine 引擎当前配置的焦点(Focus)样式。如果游戏侧实现了自定义焦点样式,则需要同步调整 LI PASS 的焦点渲染逻辑。明确方案后,LI PASS 将配合进行适配。

适用范围

当前文档仅适用 Unreal Engine 项目中 LI PASS 焦点样式的配置方式。

方案选择​

场景方案推荐
游戏和 LI PASS 使用同一套焦点样式方案一
游戏已有独立焦点样式,仅 LI PASS 需要显示焦点方案二
游戏存在特殊焦点动画或自定义渲染联系 LI PASS 团队评估适配方案

方案一:使用 UE 全局焦点样式​

除部分支持单独配置焦点样式的控件外,UE 大部分控件均使用全局统一的焦点样式。该样式使用 SetFocusBrush 接口来设置。

前提条件​

在 UE 项目设置中,将 Project Settings > User Interface > Render Focus Rule 设置成 Always。 Images: UE user interface

如果游戏侧不想修改此设置项,请参考 LIUIRootCanvas 的方案进行调整。

添加通用焦点样式代码​

在程序启动后、初始化 LI PASS 之前,调用对应引擎版本的 SetFocusBrush 接口即可。业务可根据自身游戏界面风格调整边框颜色、粗细及材质效果。

参考代码如下:

#if ENGINE_MAJOR_VERSION >= 5
#include "Styling/StarshipCoreStyle.h"
#endif
#include "Styling/SlateBrush.h"

// 核心代码
static FSlateBorderBrush* bursh = nullptr;
if (bursh == nullptr)
{
bursh = new FSlateBorderBrush("", FMargin(2.0f, 2.0f, 2.0f, 2.0f), FLinearColor::Red);
#if ENGINE_MAJOR_VERSION <= 4
FCoreStyle::SetFocusBrush(bursh);
#else
FStarshipCoreStyle::SetFocusBrush(bursh);
#endif
}

INTLSample 中的表现效果: Images: LIPASS interface

方案二:通过 LIUIRootCanvas 单独启用 LI PASS 焦点样式​

如果游戏侧已有自己的焦点表现,不希望修改全局 Render Focus Rule,可以仅对 LI PASS 页面启用公共焦点样式。

实现方式​

保持游戏当前的 Render Focus Rule 配置,使用 LIUIRootCanvas 控件替换工程中 LI PASS 页面中的 UIRoot 控件类型。这样仅 UIRoot 节点及其子节点会显示焦点样式,不会影响游戏内其他 UI。

自定义 LIUIRootCanvas 控件​

LIUIRootCanvas 重写了 OnQueryShowFocus 方法,会单独打开 UIRoot 节点及子节点的公共焦点样式渲染。

LIUIRootCanvas.h

#pragma once

#include "CoreMinimal.h"
#include "Components/CanvasPanelSlot.h"
#include "Components/CanvasPanel.h"
#include "SLIUIRootCanvas.h"
#include "LIUIRootCanvas.generated.h"

/**
*
*/
UCLASS()
class INTLSAMPLE_API ULIUIRootCanvas : public UCanvasPanel
{
GENERATED_BODY()

protected:

virtual TSharedRef<SWidget> RebuildWidget() override
{
MyCanvas = SNew(SLIUIRootCanvas);

for (UPanelSlot* PanelSlot : Slots)
{
if (UCanvasPanelSlot* TypedSlot = Cast<UCanvasPanelSlot>(PanelSlot))
{
TypedSlot->Parent = this;
TypedSlot->BuildSlot(MyCanvas.ToSharedRef());
}
}

return MyCanvas.ToSharedRef();
};
};

SLIUIRootCanvas.h

#pragma once

#include "CoreMinimal.h"
#include "Widgets/SWidget.h"
#include "Widgets/Layout/SConstraintCanvas.h"
#include "Widgets/DeclarativeSyntaxSupport.h"

/**
*
*/
class INTLSAMPLE_API SLIUIRootCanvas : public SConstraintCanvas
{
public:
virtual TOptional<bool> OnQueryShowFocus(const EFocusCause InFocusCause) const
{
return true;
}
};

需要依赖的模块:

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "SlateCore", "Slate", "UMG" });

替换 UIRoot 控件类型:

Images: LIPASS interface

注意事项​

  • SetFocusBrush 需要在初始化 LI PASS 之前调用。
  • 如果 Render Focus Rule 不设置为 Always,则 UE 默认不会显示全局 Focus Brush。
  • LIUIRootCanvas 方案仅影响 LI PASS 页面,不会影响游戏内其他 UI。
  • 如果游戏侧存在自定义焦点动画或特殊渲染逻辑,请联系 LI PASS 团队评估适配方案。