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。

如果游戏侧不想修改此设置项,请参考 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 中的表现效果:

方案二:通过 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 控件类型:

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