UE中Widget聚焦导致的问题
错误信息 “LogPlayerController: Error: InputMode:UIOnly - Attempting to focus Non-Focusable widget SObjectWidget [Widget.cpp(954)]!” 指示你在使用 Unreal Engine 的 UIOnly 输入模式时尝试聚焦一个非可聚焦的小部件。在 UE4 的 InputMode:UIOnly 中,输入(如键盘和鼠标操作)仅被限制在用户界面元素上,但你尝试聚焦的小部件不支持此操作。
解决方法:
检查是否正确设置了可聚焦属性:
确保你尝试聚焦的小部件在其属性中设置为可聚焦。这通常可以在 UMG(Unreal Motion Graphics)的编辑器中设置,或者如果你是在代码中创建小部件,确保使用了支持聚焦的小部件类(如 SButton),并且设定了相应的聚焦相关属性。
修改输入模式:
如果你的意图是让游戏同时处理UI和游戏世界的输入,不应该使用 UIOnly 模式。你可以改用 FInputModeGameAndUI 或 FInputModeGameUIOnly。例如:
FInputModeGameAndUI InputMode;
InputMode.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);
InputMode.SetWidgetToFocus(SomeWidget->TakeWidget());
GetController()->SetInputMode(InputMode);
使用 SetWidgetToFocus() 确保指定一个可以获得焦点的 UI 元素。
在代码中正确处理聚焦:
当设置输入模式并聚焦到特定小部件时,确保传递的是合适的 SWidget 引用。如果是从 UMG 创建的小部件,使用 TakeWidget() 获取 SWidget 的引用。
审查错误堆栈和相关代码:
检查 Widget.cpp 文件中第 954 行附近的代码,以理解为何发生非可聚焦小部件聚焦尝试。逐步跟踪相关调用获得更深入的理解。
调试和日志:
你可以添加更多日志输出来追踪到底是哪个部分的代码尝试操作了一个非可聚焦的小部件。
以上步骤应该帮助你诊断并解决在 UE4 中遇到的关于输入模式和小部件焦点的问题。