1、需求
大家都知道蓝图有QuitGame节点,可以退出游戏;SetFullScreenMode可以全屏、窗口化全屏和窗口化。但是为什么没有最小化啊。
2、注意事项和准备工作
2.1、模块添加
在Build.cs添加两个模块,分别是Slate和SlateCore
2.2、头文件
#include "Engine/GameEngine.h" #include "Widgets/SWindow.h"
2.3、注意事项
我测试之后发现只能在独立进程游戏情况下有效,而Play in Edit是无效的,如有知道为何的大佬,请赐教。经过断点测试发现可以通过查阅viewport的类型来控制,所以现在已经可以在PIE下实现效果了
3、代码
3.1、声明
因为我是写在继承自蓝图函数库的类,所以加上了static为全局静态函数,各位可根据自己的需求选择
UFUNCTION(BlueprintCallable,meta=(DisplayName="窗口化操作",WorldContext="WorldContextObject"),Category="StudyBF|Window|Notify") static void GameWindow(UObject* WorldContextObject,EWindowNotify WindowNotify);
3.2、定义
void UMyBF::GameWindow(UObject* WorldContextObject,EWindowNotify WindowNotify) { TIndirectArray<FWorldContext> arr1 = GEngine->GetWorldContexts(); for(int i=0;i<arr1.Num();i++) { if(arr1[i].WorldType == EWorldType::PIE || arr1[i].WorldType == EWorldType::Game) { const TWeakPtr<SWindow> GameWindowWeak = arr1[i].GameViewport->GetWindow(); TSharedPtr<SWindow> GameWindow = GameWindowWeak.Pin(); if(GameWindow) { switch (WindowNotify) { case EWindowNotify::Minimize : GameWindow->Minimize(); break; case EWindowNotify::Maximize : GameWindow->IsWindowMaximized() ? GameWindow->Restore() : GameWindow->Maximize(); break; case EWindowNotify::Exit : UKismetSystemLibrary::QuitGame(WorldContextObject,nullptr,EQuitPreference::Quit,false); break; } } break; } } }
3.3、枚举
EWindowNotify是我自己写的一个枚举,可以通过枚举进行不同的操作
UENUM(BlueprintType) enum class EWindowNotify : uint8 { Minimize UMETA(DisplayName = "最小化"), Maximize UMETA(DisplayName = "最大化/还原"), Exit UMETA(DisplayName = "退出") };
4、效果演示
4.1、蓝图节点
4.2、效果动图
5、学习方式
通过虚幻引擎自带的工具可以查看功能写法,然后找到源码部分借鉴学习
工具打开可以点击选择可测试命中控件,放到哪个地方都可以查阅相应的源码地址,非常好用
虚幻yyds~
6、结语
好了,本次分享结束了,如果对您有起到帮助,麻烦点个赞吧!
7、插件下载
我已经打包成插件了,测试了下也没问题
https://pan.baidu.com/s/1cIDwJbooRzvpdRUwuOJwmQ?pwd=t976