虚幻日常开发中,经常会遇到需要修改鼠标样式的需求,有一种方式是通过PlayerController中
SetMouseCursorWidget(EMouse::Type Cursor, UPARAM(Required) class UUseWidget* CursorWidget)
接口,通过传入鼠标类型&自定义的Widget来修改鼠标样式。该接口进一步是调用GameViewPortClient中
SetSoftwareCursorWidget(EMouseCursor::Type InCursorType, class UUseWidget* UserWidget)
的接口,该接口中如果传入的Widget为nullptr,就会执行清除操作,但是PlayerContorller中的接口中将Widget又限制为不能为空(看完后我有一点懵),主要是针对GameViewPortClient的TMap<EMouseCursor::Type, TSharedPtr<SWidget>> CursorWidgets进行赋值操作,该接口的Widget传参不能为空,就导致无法将GameViewPortClient中CursorWidget中对应的已经赋值的鼠标光标类型进行移除操作,(并且GameViewPortClient源码中没有提供接口去重置或移除该CursorWidget)
好,现在的问题是我们在某个功能去重载了某一种鼠标类型的光标样式,退出该功能的时候,我们需要将鼠标光标的样式重置到默认状态。由于项目使用的是蓝图工程,在翻阅了GameViewPortClient源码后,找到了解决方案。
首先,GameViewPortClient的接口是能进行移除操作的,但由于我们是蓝图工程,这个接口调用不了。最后发现,可以通过GameViewPortClient的
SetUseSoftwareCursorWidgets(bool bInUseSoftwareWidgets)
来设置是否启用GameViewPortClient中CursorWidgets这个变量,解决问题