在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. 通过memberlist库实现gossip管理集群以及集群数据交互

    通过memberlist库实现gossip管理集群以及集群数据交互 概述 memberlist库的简单用法如下,注意下面使用for循环来执行list.Join,原因是一开始各节点都没有runing,直 ...

  2. java通过注解顺序通过映射导出excel

    import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.ann ...

  3. Vue 路由懒加载, VueRouter一步完成Vue的路由懒加载 一行代码搞定懒加载

    Vue Router路由配置中的component里面配置即可 1 // 路由懒加载的方式加载组件 2 3 component: () => import('@/views/Detail'), ...

  4. Java中修饰符的分类及用法

    访问权限修饰符: public 修饰class,方法,变量: 所修饰类的名字必须与文件名相同,文件中最多能有一个pulic修饰的类. private class不可用,方法,变量可以用: 只限于本类成 ...

  5. DDL_操作数据库_创建&查询和DDL_操作数据库_修改&删除&使用

    DDL操作数据库.表 1.操作数据库:CRUD C(Create):创建 创建数据库: create database 数据库名称: 创建数据库判断不存在再创建 create database if ...

  6. 清北学堂 2020 国庆J2考前综合强化 Day3

    目录 1. 题目 T1 石头剪刀布 题目描述 Sol T2 铺地毯 题目描述 Sol T3 数列游戏 题目描述 Sol T4 数星星 题目描述 Sol 2. 算法 -- 动态规划 1. 概述 2. 线 ...

  7. 针对新手 按照使用顺序和频率整理的git常用指令

    PS:以下内容中的所有 aaaaaa 均为可替换的自定义内容 git status 查看当前版本状态,判断有没有未提交的变动 git add . 添加到暂存区(注意有个点)git commit -m ...

  8. Vue mixin(混入) && 插件

    1 # mixin(混入) 2 # 功能:可以把多个组件公用的配置提取成一个混入对象 3 # 使用方法: 4 # 第一步:{data(){return {...}}, methods:{...},.. ...

  9. 小白之Python基础(一)

    一.数字类型: 1.整形 十进制:默认为十进制:(如:99,100.......) 十六进制: 0x,0X开头的表示16进制数 二进制:0b,0B开头的表示2进制数 八进制: 0o,0O开头的表示8进 ...

  10. 从零开始Blazor Server(8)--增加菜单以及调整位置

    这篇干啥 这篇文章主要是把前面的一些东西稍微调整一下,使其更适合后面的内容. 主要是两个事,一个是把原来的PermissionEntity直接变成MenuEntity,直接让最后一级是菜单,这样后面就 ...