Unreal: Dynamic load map from Pak file
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
Unreal: Dynamic load map from Pak file的更多相关文章
- BUG:给Nexus7编译Android4.2的时候出现 fatal error: map: No such file or directory
情况是这样的,某人最近入手一台nexus7,于是在cyanogenmod 将nexus7的原代码下载到本地,编译环境是UBUNTU 12,04 然后编译的时候,出现了如下的错误导致编译失败 <p ...
- ObjectARX2012错误1 fatal error C1083: 无法打开包括文件:“arxHeaders.h”: No such file or directory; fatal error C1083: 无法打开包括文件:“map”: No such file or directory
问题1:fatal error C1083: 无法打开包括文件:“arxHeaders.h”: No such file or directory: 解决办法:这个问题很明显,是因为没有在工程属性里包 ...
- dynamic load javascript file.
$.ajax({ url : ("js/public/" + window.localStorage.getItem("lang") + ".js&q ...
- How to load a local .CSS file & JavaScript resources using iPhone UIWebView Class
This post will cover the basic setup and creation of an application with web content for iPhone that ...
- dynamic load jar and init spring
public class SpringLoader { private Map<String, Class<?>> classMap = new HashMap<> ...
- Load an X509 PEM file into Windows CryptoApi
http://stackoverflow.com/questions/1231178/load-an-x509-pem-file-into-windows-cryptoapi I discovered ...
- struts2 Unable to load configuration. - bean - jar:file:struts2-core-2.2.3.jar!/struts-default.xml:29:72
今天启动tomcat的时候发现如下错误记录一下! 从stackoverflow上找到 原因是加入了多个struts2包 删除相同的包即可!!
- gcc dynamic load library
Linux下一般都是直接在编译生成时挂接上链接库,运行时,把链接库放到系统环境里就可以了 但是windows出现带来了动态链接的概念,也就兴起了非windows世界的插件的概念的范潮 对应于windo ...
- 解决HDFS无法启动namenode,报错Premature EOF from inputStream;Failed to load FSImage file, see error(s) above for more info
一.情况描述 启动hadoop后发现无法打开hdfs web界面,50070打不开,于是jps发现少了一个namenode: 查看日志信息,发现如下报错: 2022-01-03 23:54:10,99 ...
随机推荐
- [倍增]luogu P4155 [SCOI2015]国旗计划
题面 https://www.luogu.com.cn/problem/P4155 问在环上最少取多少个区间能完全覆盖环 分析 首先发现是环,先把端点变为2n方便处理,注意离散化 其次要删去贡献不如其 ...
- Distributed | Paxos
自Paxos问世以来就持续垄断了分布式一致性算法,Paxos这个名词几乎等同于分布式一致性.Google的很多大型分布式系统都采用了Paxos算法来解决分布式一致性问题.在学习了Raft算法之后自然不 ...
- Java字节流和字符流,是时候总结一下IO流了
目录 从接收输入值说起 字节流读取 字符流读取 Scanner 读取 什么是 IO 流 字节流和字符流 字节流 字节输入流 字节输出流 缓冲流的原理 字符流 字符输入流 字符输出流 为什么字符流需要 ...
- house_of_storm 详解
house_of_storm 漏洞危害 House_of_storm 可以在任意地址写出chunk地址,进而把这个地址的高位当作size,可以进行任意地址分配chunk,也就是可以造成任意地址写的后果 ...
- 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之系统安装-03
自动化kolla-ansible部署ubuntu20.04+openstack-victoria之系统安装-03 欢迎加QQ群:1026880196 进行交流学习 一.镜像下载 网易源: http ...
- 1.4.17 base标签
如果我们定义的超链接在另一个窗口打开,代码如下: <!DOCTYPE html> <html lang="en"> <head> <met ...
- 09- monkey命令详解
安装模拟器 如果你没有手机可以安装个模拟器,如果有手机了,忽略此步骤. 1.下载模拟器:http://www.xyaz.cn/ 2.安装:直接默认安装. 3.打开安卓模拟器,设置-关于手机-点击版本号 ...
- 【Springboot】Springboot自动装配原理
1.核心注解就是 EnableAutoConfiguration 该注解会激活SpringBoot的自动装配功能: 代码如下: @Target(ElementType.TYPE) @Retentio ...
- 【布隆过滤器】基于Hutool库实现的布隆过滤器Demo
布隆过滤器出现的背景: 如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定.链表.树.散列表(又叫哈希表,Hash table)等等数据结构都是这种思路,存储 ...
- hdu4771 水搜索(状态压缩+bfs)
题意: 给你一个n*m的地图,问你从起点出发,吧所有的宝藏都捡完用的最少时间. 思路:k <= 4,水题,直接开一个数组mark[now][x][y];now代表的是当前检宝藏的二进制 ...