Unreal: Dynamic load map from Pak file

目标:在程序运行时加载自定义 Pak 文件,并打开指定关卡,显示其中的完整 map 内容

Unreal 的 Pak 文件内包括了物体,材质,blueprint,map等等。Level 以 map 的形式保存。

Firsr of all, Pak 相关的调试需要 Package Project 执行,不能在 Editor 里面直接 Launch,否则 FCoreDelegates::MountPak IsBound 为 false , 则无法执行后续操作。

Code

在 GameMode 的 InitGame() 内调用如下代码。

void MyMainClass::MyMainClass::Exe(UWorld *world) {
UE_LOG(LogTemp, Warning, TEXT("Init Main class"));
if (FCoreDelegates::MountPak.IsBound())
{
UE_LOG(LogTemp, Warning, TEXT("LoadPakDelegate(): OnMountPak.IsBound()"));
FString pakPath = TEXT("../../../MyProject3/Content/Paks/MyProject1-MacNoEditor.pak");
IPakFile *pakFile = FCoreDelegates::MountPak.Execute(pakPath, 4);
if (pakFile)
{
const auto& mountPoint = pakFile->PakGetMountPoint();
UE_LOG(LogTemp, Warning, TEXT("LoadPakDelegate(): MountPoint %s"), *mountPoint);
FString pakContentPath = mountPoint + "MyProject1/Content/";
// FPackageName::RegisterMountPoint("/Game/", "../../../MyProject1/Content/");
FPackageName::RegisterMountPoint("/Game/", pakContentPath); UGameplayStatics::OpenLevel(world, FName(TEXT("Map2")) );
}
}
else
{
UE_LOG(LogTemp, Warning, TEXT("LoadPakDelegate(): OnMountPak.IsBound() Falied"));
}
}

RegisterMountPoint 的分析

static void  RegisterMountPoint
(
    const FString & RootPath,
    const FString & ContentPath
)

This will insert a mount point at the head of the search chain (so it can overlap an existing mount point and win).

参数解释:

RootPath: Logical Root Path.

ContentPath: Content Path on disk.

Logical Path 是程序运行时会去找的 path 并非实际路径,根据反复尝试,只有在这个参数写成 “/Game/” 的时候才能正确加载到所有资源,若随意命名可能只能加载到 map 资源,连 map_builtdata 都找不到。会有如下报错:

LogStreaming: Error: Couldn't find file for package /Game/StarterContent/Maps/Map2_BuiltData requested by async loading code. NameToLoad: /Game/StarterContent/Maps/Map2_BuiltData

我的猜测是当前运行的程序的默认加载路径是 Game 所以这样写可以成功,应该也有方法自定义加载的路径,但是我暂时不知道。

Content Path 是指需要 mount 到前面这个目录的内容的父路径,这个路径取决于加载的Pak 的当前挂载点和 Pak 内部的文件路径。

通过 PakGetMountPoint() 函数得到挂载点为 "../../../"

而且 Pak 内部文件如下

MyProject1/Content/StarterContent/Blueprints/...
MyProject1/Content/StarterContent/Maps/...
MyProject1/Content/StarterContent/Materials/...
MyProject1/Content/StarterContent/Shapes/...
...

故最终路径为 “../../../MyProject1/Content/”

Missing shader resource

成功加载 map 但是模型材质和 shader 丢失,log 如下:

[UE4] [2021.05.17-03.57.53:734][  0]LogShaders: Error: Missing shader resource for hash '589973CAE03D7F0ECFEC6B825B774136FF9FCB9D' for shader platform 16 in the shader library
LogMaterial: Error: Tried to access an uncooked shader map ID in a cooked application
[UE4] [2021.05.17-08.02.25:186][ 0]LogMaterial: Can't compile BasicShapeMaterial with cooked content, will use default material instead

这个问题原因是在要加载 Pak 的工程设置里面启用了 Share Material Shader Code,启用这个选项会 “Save shader only once” 这样的优化选项导致了外部的 shader 无法被找到。

在工程中关闭此开关即可。

Ref:

https://answers.unrealengine.com/questions/363767/how-to-load-a-map-from-a-dynamic-level.html 参见 TestyRabbit May 03 '18 at 4:07 PM 的评论

sample code: https://pastebin.com/ZWAPtynK

https://answers.unrealengine.com/questions/258386/loading-map-from-pak-at-runtime.html top 回答

https://answers.unrealengine.com/questions/963414/view.html

最新文章

  1. 学习笔记:Maven构造版本号的方法解决浏览器缓存问题
  2. 【IOS】异步调用--- 简单使用记录
  3. 使用three.js创建3D机房模型-分享一
  4. Java开发中经典的小实例-(打印九九乘法表)
  5. epoll使用具体解释(精髓)
  6. Html+Css+Js_之table每隔3行显示不同的两种颜色
  7. Python 列表排序方法reverse、sort、sorted详解
  8. 【RL-TCPnet网络教程】第19章 RL-TCPnet之BSD Socket服务器
  9. 【原创】大叔经验分享(13)spark运行报错WARN Utils: Service 'sparkDriver' could not bind on port 0. Attempting port 1.
  10. 【QML与C++混合编程】用QVariantList传递数组类型成员
  11. TypeError: atlas.getSpriteFrame is not a function
  12. 求两个数之间的质数 -----------基于for循环 算法思想
  13. Jmeter(四十一)分布式测试(转!)
  14. c#的Boolean.Parse用法
  15. Jmeter关于上传图片接口
  16. 搜狐视频Redis私有云平台CacheCloud
  17. js判断用户是在PC端或移动端访问
  18. CallableStatement简单使用
  19. 水仙花之java与c++的战争======
  20. pulic——function(下载的公共的)

热门文章

  1. ch2_8_4求解投骰子游戏问题
  2. 【LiteOS】Liteos移植篇
  3. 第21 章 : Kubernetes 存储架构及插件使用
  4. 抗DDOS应急预案实践-生产环境总结-建议必看
  5. [矩阵乘法]裴波拉契数列III
  6. 免费开源的客服系统 Linux 服务器环境安装部署过程
  7. [开源]制作docker镜像不依赖linux和Docker环境
  8. 「新特性」Spring Boot 全局懒加载机制了解一下
  9. DevEco Device Tool 2.1 Beta1 的Hi3861在Windows平台的编译体验
  10. 【笔记】《Redis设计与实现》chapter14 服务器