UE5热更新:Pak包的Cook、打包、加载全流程及踩坑经验分享

这篇具有很好参考价值的文章主要介绍了UE5热更新:Pak包的Cook、打包、加载全流程及踩坑经验分享。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这几天弄UE5的Pak包加载,弄得晕头转向,网上都是UE4.27以下的教程,UE4.27, UE5修改了一些东西,导致按照[虚幻官方直播第四期的教程](https://www.bilibili.com/video/BV1Ut411A7sk?spm_id_from=333.337.search-card.all.click&vd_source=f7b2defde4971310a19a6e9e40c36b90)无法成功加载,废话不多说,先说一下踩的坑。


一·UE5加载Pak和UE4不同的地方

1.取消Use Iostore(使用Io保存)的勾选

UE5热更新,Pak包加载,UE5 Pak包Cook,UE5 Pak包打包,UE5 Pak包加载,UE5热更新踩坑,UE5热更新经验分享,UE5热更新教程

UE5的打包设置中自动勾选了使用Io保存,还是试用功能,引擎的Mount函数中有对此的判断,
UE5热更新,Pak包加载,UE5 Pak包Cook,UE5 Pak包打包,UE5 Pak包加载,UE5热更新踩坑,UE5热更新经验分享,UE5热更新教程
如果启用IO保存,会检测是否存在对应的.utoc文件,如果没有,返回false,Mount失败。
我们自己使用UE5的Cook,打包是不会生成.utoc文件的,导致一直加载失败。至于如何正确使用Iostore之后有时间再看看。

2.取消共享材质着色器代码(Share Material Shader Code)勾选

UE5默认启动共享材质着色器代码,导致加载出来的Actor材质丢失,取消勾选可以解决问题。
UE5热更新,Pak包加载,UE5 Pak包Cook,UE5 Pak包打包,UE5 Pak包加载,UE5热更新踩坑,UE5热更新经验分享,UE5热更新教程

3.蓝图调用C++路径名莫名其妙的多了一个空白的字符

这个可能大家没遇到,我遇到了,在调试的时候发现,FString类型的参数莫名其妙多了一个空白的字符,导致一直无法找到Pak包。教程使用命令行调用该函数不存在这个问题,我将参数在C++里写死了,规避了这个问题,以后有时间再看看。
UE5热更新,Pak包加载,UE5 Pak包Cook,UE5 Pak包打包,UE5 Pak包加载,UE5热更新踩坑,UE5热更新经验分享,UE5热更新教程
主要踩了这三个坑,下面再说一下整个Pak的使用流程。

二、UE5 Pak包的Cook,打包,加载流程

1.cook

先创建DLC文件夹,有一个Actor,一个贴图,一个材质,一个Mesh,
UE5热更新,Pak包加载,UE5 Pak包Cook,UE5 Pak包打包,UE5 Pak包加载,UE5热更新踩坑,UE5热更新经验分享,UE5热更新教程
在Actor里面添加测试代码,每秒打印一次“耶,我被成功加载了”
UE5热更新,Pak包加载,UE5 Pak包Cook,UE5 Pak包打包,UE5 Pak包加载,UE5热更新踩坑,UE5热更新经验分享,UE5热更新教程

将DLC文件夹添加到要烘焙的额外资产目录
UE5热更新,Pak包加载,UE5 Pak包Cook,UE5 Pak包打包,UE5 Pak包加载,UE5热更新踩坑,UE5热更新经验分享,UE5热更新教程
在平台中启用烘焙,这里要注意,UE4的烘焙按钮是在文件里面,UE5的烘焙按钮在平台
UE5热更新,Pak包加载,UE5 Pak包Cook,UE5 Pak包打包,UE5 Pak包加载,UE5热更新踩坑,UE5热更新经验分享,UE5热更新教程
烘焙成功后,可以看到G:\UE5Demo\PakTest\Saved\Cooked\Windows\PakTest\Content\DLC里面有DLC的.uasset文件

2 打Pak包

找到引擎目录的UnrealPak.exe,教程说可以将它不依赖UE的库,可以将它移到任意地方运行,试了一下,不行。老老实实使用cmd运行,cd到该目录下,运行UnrealPak.exe。
UE5热更新,Pak包加载,UE5 Pak包Cook,UE5 Pak包打包,UE5 Pak包加载,UE5热更新踩坑,UE5热更新经验分享,UE5热更新教程
然后输入命令unrealpak {pak目录} -create={cook文件的目录} 打pak包
unrealpak G:\dlc.pak -create=G:\UE5Demo\PakTest\Saved\Cooked\Windows\PakTest\Content\DLC
这是普通的打pak的方式,加密或者压缩Pak包我就不演示。
输入命令unrealpak {pak目录} -list 查看pak包
unrealpak G:\dlc.pak -list
UE5热更新,Pak包加载,UE5 Pak包Cook,UE5 Pak包打包,UE5 Pak包加载,UE5热更新踩坑,UE5热更新经验分享,UE5热更新教程

3. 加载Pak包

创建一个C++类继承自Actor,在工程build.cs里面添加模块"PakFile"

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "PakFile" });


在.h里声明OldPlatform和PakPlatform,这里不求甚解,不用理会到底是干嘛的,花大代价搞明白了估计也过几天就忘。
声明TestLoadPak函数,这里使用蓝图调用,也可以学习教程使用命令行调用,将UFUNCTION(BlueprintCallable)改为UFUNCTION(Exec)即可。

	TSharedPtr<class FPakPlatformFile> PakPlatform;
	class IPlatformFile* OldPlatform;
	UFUNCTION(BlueprintCallable)
	bool TestLoadPak(const FString& InPakFullPath);


在.cpp文件中引用头文件

#include "MyActor.h"#include "IPlatformFilePak.h"#include "HAL/PlatformFilemanager.h"#include "Runtime/Engine/Classes/Engine/StreamableManager.h"#include "Runtime/Engine/Classes/Engine/AssetManager.h"#include "Runtime/Engine/Classes/Engine/StaticMeshActor.h"#include "Kismet/KismetStringLibrary.h"


实现BeginPlay函数,初始化

	Super::BeginPlay();
	OldPlatform = &FPlatformFileManager::Get().GetPlatformFile();
	PakPlatform = MakeShareable(new FPakPlatformFile());
	PakPlatform->Initialize(&FPlatformFileManager::Get().GetPlatformFile(), TEXT(""));


实现TestLoadPak函数

bool AMyActor::TestLoadPak(const FString& InPakFullPath){

	FPlatformFileManager::Get().SetPlatformFile(*PakPlatform.Get());

	FString PakFileFullPath = L"g:/dlc.pak";
	if (!FPlatformFileManager::Get().GetPlatformFile().FileExists(*PakFileFullPath))
		return false;
	//FString PakName = GetPakFileName(PakFileFullPath);

	TRefCountPtr<FPakFile> TmpPak = new FPakFile(PakPlatform.Get(), *PakFileFullPath, false);
	FString OldPakMountPoint = TmpPak->GetMountPoint();

	int32 ContentPos = OldPakMountPoint.Find("Content/");
	FString NewMountPath = OldPakMountPoint.RightChop(ContentPos);

	FString ProjectPath = FPaths::ProjectDir();
	//ProjectPath = "../../../PakTest/";
	NewMountPath = ProjectPath + NewMountPath;
	TmpPak->SetMountPoint(*NewMountPath);

	if (PakPlatform->Mount(*PakFileFullPath, 1, *NewMountPath))
	{
		//StaticMesh'/Game/DLC/SM_Cube.SM_Cube_C'
		//Blueprint'/Game/DLC/DLC_Cube.DLC_Cube'
		//World'/Game/ThirdPerson/Maps/ThirdPersonMap.ThirdPersonMap'
		TArray<FString> FoundFilenames;
		TmpPak->FindFilesAtPath(FoundFilenames, *TmpPak->GetMountPoint(), true, false, false);
		if (FoundFilenames.Num() > 0)
		{
			if (GetWorld()->WorldType == EWorldType::Game)
			{
				for (FString& Filename : FoundFilenames)
				{
					if (Filename.EndsWith(TEXT(".uasset")))
					{
						FString NewFileName = Filename;
						FString PathDir = FPaths::ProjectContentDir();
						NewFileName.ReplaceInline(*PathDir, TEXT("/Game/"));
						FString File = FPaths::GetBaseFilename(Filename);
						NewFileName.ReplaceInline(TEXT("uasset"), *File);
						FString blueprint = TEXT("Blueprint'");
						NewFileName.Append(TEXT("_C'"));
						GEngine->AddOnScreenDebugMessage(-1, 20.0f, FColor::Red, *NewFileName);

						NewFileName=UKismetStringLibrary::Concat_StrStr(TEXT("Blueprint'"), NewFileName);
						UClass* Class = LoadClass<AActor>(NULL, *NewFileName);
						//UClass* Class = LoadClass<AActor>(NULL, TEXT("Blueprint'/Game/DLC/DLC_Cube.DLC_Cube_C'"));
						if (Class == nullptr)
						{
							GEngine->AddOnScreenDebugMessage(-1, 20.0f, FColor::Red, TEXT("Load Class Error"));
						}
						else
						{
							AActor* MeshActor = GetWorld()->SpawnActor<AActor>(Class, FVector(100, 100, 400), FRotator(0, 0, 0));
						}
					}
				}
			}	
		}
	}
	//设置回原来的读取方式,不然包内的资源可能访问不了
	FPlatformFileManager::Get().SetPlatformFile(*OldPlatform);
	return true;}


这个例子指的注意的是有三个路径,
1.Pak包的路径-PakFileFullPath,我将Pak包的路径写死的原因是之前提到,蓝图传参的时候,莫名其妙多了一个空字符,导致路径一直不对。然后生成一个FPakFile对象,注意UE5将FPakFile的析构函数私有化了,不能使用共享智能指针。

TRefCountPtr<FPakFile> TmpPak = new FPakFile(PakPlatform.Get(), *PakFileFullPath, false);


2.挂载点的路径-NewMountPath,NewMountPath=“…/…/…/PakTest/Content/DLC”,要想办法拼对这个路径,具体需要在打包之后调试一下,查看各个路径的值,最终拼成上述值的结构"…/…/…/{项目名}/Content/{DLC目录}"。然后设置挂载点并挂载

TmpPak->SetMountPoint(*NewMountPath);PakPlatform->Mount(*PakFileFullPath, 1, *NewMountPath)


3.Pak包资源的虚拟路径-NewFileName,我的是"Blueprint’/Game/DLC/DLC_Cube.DLC_Cube_C’",在我们烘培的时候,直接在UE5编辑器选择资源-》复制引用,后面加上”_C“,即可得到该路径。我们也是要把从Pak包里读出的文件名拼成这样的路径。最后通过LoadClass加载虚拟路径的资源,并生成,

UClass* Class = LoadClass<AActor>(NULL, *NewFileName);AActor* MeshActor = GetWorld()->SpawnActor<AActor>(Class, FVector(100, 100, 400), FRotator(0, 0, 0));


最后派生一个Actor,调用该函数,放到场景中,将UE5编辑器的DLC文件夹删除,注意每次执行删除资源或者移动资源时,要选择内容右键修复文件夹中的重定向器,这样才能将引用,资源处理完成。

最后打包项目,运行
UE5热更新,Pak包加载,UE5 Pak包Cook,UE5 Pak包打包,UE5 Pak包加载,UE5热更新踩坑,UE5热更新经验分享,UE5热更新教程
最后能看到左上角的打印,前方的带纹理的小方块,终于成功啦,普天同庆,完结撒花。

如果没有看到上述效果,可以将程序附加到VS的进程进行调试,查看各个路径对不对。文章来源地址https://www.toymoban.com/news/detail-780059.html

到了这里,关于UE5热更新:Pak包的Cook、打包、加载全流程及踩坑经验分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UE5 动态加载资源和类

    因为是动态加载,所以不用在构造的时候去加载。这里再BeginPlay里加载。 加载StaticMesh等资源,就使用LoadObjectUStaticMesh(nullptr,TEXT(\\\"Copy Reference\\\")) 加载类资源,比如蓝图Actor类 就使用LoadClassAActor(this,TEXT(\\\"Copy Reference\\\")) 但是同样要在最后一个字母后+_C  TEXT(\\\"/Script/Engine.Blueprint\\\'/Ga

    2024年02月21日
    浏览(30)
  • UE5加载websocket模块为空

    今天测试UE 发现工程启动不了,后来看到原来是websocket模块无法加载。 解决的它的方法很简单,这种问题一般会出现在源码版本的引擎或者是停电了,导致UElaunch版本损坏,解决方法是来到源码版本的引擎 这个目录下: D:UnrealEngine-5.2EngineBinariesWin64 找到下面这两个,删除

    2024年02月06日
    浏览(31)
  • UE5 C++ 静态加载资源和类

    一.上篇文章创建组件并绑定之后 在Actor中加载初始化了组件,现在在组件中赋值。使用static ConstructorHelpers::FObjectFinderTTempName(TEXT(\\\"Copy Reference\\\"));再用TempName.Object 里面的资源都来自StarterContent   效果如下: 二.静态加载类 1.在Actor中再声明一个AActor类  2.在静态加载类时使用

    2024年02月21日
    浏览(36)
  • UE5 使用WebUI加载网页 页面黑屏

    0x00问题产生环境: Visual Studio2019 UE5 5.0.3 报错和截图如上,我是打包出来的exe在有些电脑上是没有问题的,有些电脑上出现这种情况。 0x01解决办法 如图修改: DefaultRHI选项 由Directx 12修改为Default即可 。(我的问题是通过这个解决的,希望对有需要的小伙伴们有帮助。) 0x02补

    2024年02月12日
    浏览(36)
  • ue4.27空项目打包不卡ue5.1空项目打包运行卡的要命研究测试

    知乎上有人提问 lumen是如何做到不卡顿的,我却不以为然,我的显卡虽然算不上好显卡,但是也不至于独立显卡一个空项目都玩不起吧,打个cf,玩腾讯模拟器和平精英吃鸡肯定还是会很流畅的. 一个空项目都卡,怎么能说是我电脑配置问题呢??? 再来看提示 image.png image.png 反射设置的

    2023年04月21日
    浏览(29)
  • UE5和UE4版本更新重大改变汇总。

    转载:UE5和UE4版本更新重大改变汇总。 - 知乎 (zhihu.com) 用户界面变化: 1,原先拖动给放置Actor的place actors,世界大纲,Level等都可以通过右击隐藏到侧边栏; 2,Command命令窗口和ContentBrowser位置变化到底边栏: tips:点击ContentBrowser可以直接隐藏,而不需要像以前一样移到别处

    2024年03月18日
    浏览(50)
  • UE5 C++ Slate独立程序的打包方法

     在源码版安装目录内找到已编译通过的xxx.exe,(EngineBinariesWin64xxx.exe),在需要的位置新建文件夹,拷贝源码版Engine内的Binaries、Content、Shaders文件夹到目标文件夹内,将xxx.exe放入对应位置,删除目标文件夹内Binaries、Content、Shaders中多余的文件夹,运行xxx.exe测试

    2024年01月23日
    浏览(34)
  • 【虚幻引擎】UE5 C++编译和打包失败的原因

    解决办法一:可以去官网下载https://dotnet.microsoft.com/en-us/download/dotnet/3.1   解决方案二:打开Visual Studio Installer,选择单个组件,勾选NET Core 3.1 原因:这是由于更新版本到5.03的时候, 产生的 解决办法一:使用低版本 解决办法二:使用低版本的TP_VirtualRealityBP.upack,替换这个报

    2024年02月03日
    浏览(51)
  • UE5 UE4 打包报错Failed to compile material 解决

    参考:https://forums.unrealengine.com/t/failed-to-compile-material-for-pcd3d_sm5-warning/385087 https://forums.unrealengine.com/t/failed-to-compile-material-for-platform-pcd3d-sm4/436176 报错:Failed to compile Material for platform PCD3D_SM5 ..... 解决方法:在project settings中,找到 Packaging - share material shader code中,去掉勾选

    2024年01月17日
    浏览(32)
  • UE5.1 透明渲染流程框架图

    相关文章:  UE 透明物体绘制准备_sh15285118586的博客-CSDN博客  透明直接光和间接光生成_sh15285118586的博客-CSDN博客 Scene:Translucency-Translucency(AfterDOF)_sh15285118586的博客-CSDN博客 Scene:Translucency-Distortion PostProcessing:ComposeTranslucencyToNewSceneColor_sh15285118586的博客-CSDN博客

    2024年02月10日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包