← SEARCHABLE ARCHIVE
Unreal Engine · 2026-07-14

输入模式和 TWeakObjectPtr

清楚地表示 UI 输入和 UObject 生命周期

INTERACTIVE READING MODE →

该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。

当您打开 UI 时,鼠标可以工作,但可能会出现所有键盘快捷键被阻止的问题。 ProjectDT 的白板必须在操作 UI 时持续接收键盘输入。

根据您的目的选择输入模式。

FInputModeGameAndUI InputMode;
InputMode.SetHideCursorDuringCapture(false);
PlayerController->SetInputMode(InputMode);
PlayerController->bShowMouseCursor = true;

FInputModeUIOnly适合关注 UI 的情况,但对于游戏端也需要按键输入的屏幕来说可能太强了。 FInputModeGameAndUI将 UI 和游戏输入保持在一起。

关注哪个小部件也很重要。 如果 EditableTextBox 消耗击键,则快捷方式可能不会传递到 PlayerController。

不需要长期持有的对象就是弱指针。

尽管 UI 子系统当前记住 MainWidget 和 WhiteBoard,但它不需要拥有这些对象的生命周期。

TWeakObjectPtr<UMainWidget> MainUI;
TWeakObjectPtr<UInvestigateWhiteBoard> ActiveWhiteBoard;

TObjectPtr跟踪 UObject 引用并可以影响具有强引用的对象的生存。 TWeakObjectPtr当对象被销毁时就会失效,所以在使用前要检查一下。

if (UMainWidget* Widget = MainUI.Get())
{
    Widget->ShowOverlay();
}

指向前向声明类型的弱指针的内联 Setter 可能会导致编译错误。 更安全的做法是仅将声明保留在标头中,并将其分配到包含该类型的整个定义的 CPP 中。

输入模式和指针类型不是简单的语法选择。 这是在代码中表达谁将接收输入以及谁将拥有对象生命周期的选择。