在UE的开发中,有些项目需要针对不同版本出不同的包,并有一个对应的GUI界面,供大家使用。

1.插件编写

先使用UE4自己的插件模板创建插件,做成插件形式

然后注册Slate UI,编写打开逻辑。并在按钮点击函数PluginButtonClicked内触发。

.cpp部分代码如下:

#include "PackageHelper.h"
#include "PackageHelperStyle.h"
#include "PackageHelperCommands.h"
#include "Misc/MessageDialog.h"
#include "ToolMenus.h" #include "GameMapsSettings.h"
#include "Misc/FileHelper.h"
#include "FileHelpers.h" static const FName PackageHelperTabName("PackageHelper"); #define LOCTEXT_NAMESPACE "FPackageHelperModule" TSharedRef<SDockTab> FPackageHelperModule::WindowBody(const FSpawnTabArgs& SpawnTabArgs)
{
return SNew(SDockTab)
.TabRole(ETabRole::NomadTab)
[
SNew(SVerticalBox)
+ SVerticalBox::Slot()
[
SNew(SButton)
.Content()
[
SNew(STextBlock)
.Justification(ETextJustify::Center)
.Text(LOCTEXT("Build Test Package1", "Build Test Package1"))
]
.OnClicked_Lambda([this]()
{
//Clicked Test Package1. return FReply::Handled();
})
]
+ SVerticalBox::Slot()
[
SNew(SButton)
.Content()
[
SNew(STextBlock)
.Justification(ETextJustify::Center)
.Text(LOCTEXT("Build Test Package2", "Build Test Package2"))
]
.OnClicked_Lambda([this]()
{
//Clicked Test Package2. return FReply::Handled();
})
]
+ SVerticalBox::Slot()
[
SNew(SButton)
.Content()
[
SNew(STextBlock)
.Justification(ETextJustify::Center)
.Text(LOCTEXT("Build Test Package3", "Build Test Package3"))
]
.OnClicked_Lambda([this]()
{
//Clicked Test Package3. return FReply::Handled();
})
]
];
} void FPackageHelperModule::StartupModule()
{
FPackageHelperStyle::Initialize();
FPackageHelperStyle::ReloadTextures();
FPackageHelperCommands::Register(); PluginCommands = MakeShareable(new FUICommandList); PluginCommands->MapAction(
FPackageHelperCommands::Get().PluginAction,
FExecuteAction::CreateRaw(this, &FPackageHelperModule::PluginButtonClicked),
FCanExecuteAction()); UToolMenus::RegisterStartupCallback(FSimpleMulticastDelegate::FDelegate::CreateRaw(this, &FPackageHelperModule::RegisterMenus)); FGlobalTabmanager::Get()->RegisterNomadTabSpawner(PackageHelperTabName
, FOnSpawnTab::CreateRaw(this, &FPackageHelperModule::WindowBody))
.SetDisplayName(LOCTEXT("PackageHelper", "PackageHelper"))
.SetMenuType(ETabSpawnerMenuType::Hidden);
} void FPackageHelperModule::ShutdownModule()
{
UToolMenus::UnRegisterStartupCallback(this);
UToolMenus::UnregisterOwner(this); FPackageHelperStyle::Shutdown();
FPackageHelperCommands::Unregister(); FGlobalTabmanager::Get()->UnregisterNomadTabSpawner(PackageHelperTabName);
} void FPackageHelperModule::PluginButtonClicked()
{
FGlobalTabmanager::Get()->TryInvokeTab(PackageHelperTabName);
} void FPackageHelperModule::RegisterMenus()
{
FToolMenuOwnerScoped OwnerScoped(this);
{
UToolMenu* Menu = UToolMenus::Get()->ExtendMenu("LevelEditor.MainMenu.Window");
{
FToolMenuSection& Section = Menu->FindOrAddSection("WindowLayout");
Section.AddMenuEntryWithCommandList(FPackageHelperCommands::Get().PluginAction, PluginCommands);
}
} {
UToolMenu* ToolbarMenu = UToolMenus::Get()->ExtendMenu("LevelEditor.LevelEditorToolBar");
{
FToolMenuSection& Section = ToolbarMenu->FindOrAddSection("Settings");
{
FToolMenuEntry& Entry = Section.AddEntry(FToolMenuEntry::InitToolBarButton(FPackageHelperCommands::Get().PluginAction));
Entry.SetCommandList(PluginCommands);
}
}
}
} #undef LOCTEXT_NAMESPACE IMPLEMENT_MODULE(FPackageHelperModule, PackageHelper)

PackageHelper.cpp

2.DefaultEngine.ini配置文件修改

因为打包不同内容加载的地图也不一样,所以在打包前先在配置文件里更新GameDefaultMap,

虽然RunUAT.bat也可以传入打包地图,但那样灵活性稍差一些。

此处使用GConfig写入配置文件:

FString MapPath;//要用UE路径格式,例如:Game/Maps/ThirdPersonExampleMap.ThirdPersonExampleMap
FString Path = FPaths::ConvertRelativePathToFull(FPaths::ProjectConfigDir() + TEXT("DefaultEngine.ini"));
GConfig->SetString(TEXT("/Script/EngineSettings.GameMapsSettings"), TEXT("GameDefaultMap"), *MapPath, *Path);
GConfig->Flush(false, *Path);//Read参数为false是针对写入Flush,true是针对读取

3.RunUAT.bat打包

与Unity直接封装好了打包函数不同,UE中需要用RunUAT.bat打包,位于引擎目录:

Engine/Build/BatchFiles/RunUAT.bat

打包时,需要阻塞UE自身线程,这样可以在打包完成后做一些事情,

这里使用FPlatformProcess运行RunUAT.bat,具体代码如下:

//打包函数,参数BuildPath为打包输出目录(注意路径结尾不带斜杠,否则打包失败)
void BuildPackage(FString BuildPath)
{
FString RunUATPath = FPaths::ConvertRelativePathToFull(FPaths::EngineDir())
+ FString("Build/BatchFiles/RunUAT.bat");
FString UE4EditorCmdPath = FPaths::ConvertRelativePathToFull(FPaths::EngineDir())
+ FString("Binaries/Win64/UE4Editor-Cmd.exe");
FString UProjectPath = FPaths::ConvertRelativePathToFull(FPaths::GameSourceDir()
+ TEXT("../")); TArray<FString> AssetName;
IFileManager::Get().FindFiles(AssetName, *UProjectPath, TEXT(".uproject"));
UProjectPath += AssetName[0]; FString Arg = FString("-ScriptsForProject=\"" + UProjectPath + "\" BuildCookRun -project=\""
+ UProjectPath +"\" -targetplatform=Win64 -clientconfig=Development -ue4exe=\""
+ UE4EditorCmdPath + "\" -noP4 -iterate -cook -pak -package -stage -archive -archivedirectory=\""
+ BuildPath + "\" -nocompileeditor -prereqs -nodebuginfo -build -CrashReporter -utf8output -compressed"); FProcHandle Handle = FPlatformProcess::CreateProc(*RunUATPath, *Arg
, false, false, false, nullptr
, 2, nullptr, nullptr);
//创建进程打包,PriorityModifer可以填2,进程优先级会高一些 FPlatformProcess::WaitForProc(Handle);
//堵塞,等待新进程打包完成 UE_LOG(LogTemp, Log, TEXT("Package Successful!"));
//这里可以加一些打包完的后续操作
}

这样重启UE之后即可使用打包工具,提升开发效率。

最后Build.cs中还需要添加一些模块依赖,参考如下:

PrivateDependencyModuleNames.AddRange(
new string[]
{
"Projects",
"InputCore",
"UnrealEd",
"ToolMenus",
"CoreUObject",
"Engine",
"Slate",
"SlateCore",
"EngineSettings"
}
);

Build.cs依赖模块参考

UE4自动打包工具编写的更多相关文章

  1. iOS 本地自动打包工具

    1.为什么要自动打包工具? 每修改一个问题,测试都让你打包一个上传fir , 你要clean -> 编译打包 -> 上传fir -> 通知测试.而且打包速度好慢,太浪费时间了.如果有 ...

  2. Unity自动打包工具

    转载 https://blog.csdn.net/ynnmnm/article/details/36774715 最开始有写打包工具的想法,是因为看到<啪啪三国>王伟峰分享的一张图,他们有 ...

  3. Android自动打包工具aapt详解

    概念 在Android.mk中有LOCAL_AAPT_FLAGS配置项,在gradle中也有aaptOptions,那么aapt到底是干什么的呢? aapt即Android Asset Packagi ...

  4. IOS 通过脚本自动打包工具 webfrogs/xcode_shell

    博文转载至 http://www.2cto.com/kf/201506/408346.html ios 开发通过xcode 打包其实效率不是太高,所以就有人,用shell 写了一个,自动打包,发邮件, ...

  5. {转}Unity3d+Jenkins 自动编译iOS、Android版本(U3D远程自动打包工具)

    http://www.cnblogs.com/yinghuochong/archive/2013/09/01/3294940.html

  6. 4.使用webpack-dev-server工具实现自动打包编译的功能

    使用webpack-dev-server这个工具,来实现自动打包编译的功能 1.运行 npm i webpack-dev-server -D 把这个工具安装到项目的本地开发依赖 或者运行 cnpm i ...

  7. 细说前端自动化打包工具--webpack

    背景 记得2004年的时候,互联网开发就是做网页,那时也没有前端和后端的区分,有时一个网站就是一些纯静态的html,通过链接组织在一起.用过Dreamweaver的都知道,做网页就像用word编辑文档 ...

  8. CoolPlist 帧动画自动生成工具

    工具英文名称:CoolPlist作者: 陈前帆 thinkingMan | sonny 邮箱: 625936034@qq.com | chenqianfan1@163.com电话: 136704713 ...

  9. xcodebuild和xcrun实现自动打包iOS应用程序

    随着苹果手持设备用户的不断增加,ios应用也增长迅速,同时随着iphone被越狱越来越多的app 的渠道也不断增多,为各个渠道打包成了一件费时费力的工作,本文提供一种比较智能的打包方式来减少其带来的各 ...

随机推荐

  1. 使用Karmada实现Helm应用的跨集群部署

    摘要:借助Karmada原生API的支持能力,Karmada可以借助Flux轻松实现Helm应用的跨集群部署. 本文分享自华为云社区< 使用Karmada实现Helm应用的跨集群部署[云原生开源 ...

  2. 手把手教你用 Python 下载手机小视频

    今天为大家介绍使用 mitmproxy 这个抓包工具如何监控手机上网,并且通过抓包,把我们想要的数据下载下来. 启动 mitmproxy 首先我们通过执行命令 mitmweb 启动mitmproxy, ...

  3. Docker部署jar包运行

    1.上传jar包到服务器 2.在该目录下创建Dockerfile 文件 vi Dockerfile 3.然后将下面的内容复制到Dockerfile文件中 FROM java:8 MAINTAINER ...

  4. 扩展新的WCV到标准的WC后,不能在业务角色里面看见视图解决方法

    by zyi 感谢群主红枣的分享 1.把你的WCVIEW扩展进WC中 2.使用UI Designer打开你的WCVIEW 3.更改你的WCVIEW名字

  5. Java开发学习(十三)----基于注解开发定义第三方bean及注解开发总结

    在前面的博客中定义bean的时候都是在自己开发的类上面写个注解就完成了,但如果是第三方的类,这些类都是在jar包中,我们没有办法在类上面添加注解,这个时候该怎么办? 遇到上述问题,我们就需要有一种更加 ...

  6. super与this关键字图解和java继承的三个特点

    java继承的三个特点 java语言是单继承的 一个类的直接父类只能有一个 class A{} class B extends A{}//正确 class C{} class D extends A, ...

  7. 开源MyBatisGenerator组件源码分析

    开源MyBatisGenerator组件源码分析 看源码前,先了解Generator能做什么? MyBatisGenerator是用来生成mybatis的Mapper接口和xml文件的工具,提供多种启 ...

  8. PhoneBean实体类的封装和map输出键值对的设置

    之前我们写好了bean类型.现在我们再看看这个需求中,map和reduce各自的流程. Map阶段: 字段切分以后保留如下字段:以第一行为例,就保留13726230503112  2481 24681 ...

  9. html的基础01

    1.什么是网页 2.常用的浏览器有哪些 3.web标准是什么  1.什么是网页  2.常用的浏览器 360.百度那些都是国产浏览器,内核一样,以上六个都是国际浏览器,不同厂商生产(但IE和Edge都是 ...

  10. YII http缓存

    http禁止缓存原理 header('Expires: 0'); header('Last-Modified: '. gmdate('D, d M Y H:i:s') . ' GMT'); heade ...