Cannot create SoftObjectPath with short package name 'False'!
-
表现:在Cook 阶段会报错,样子大概是这样:
打包报错 原因: UE4editor在蓝图中创建变量,默认为Bool 类型,而且默认值为False,当我需要把它的类型修改为 Actor(或者其它对象)时,它的默认值会继续为False,而不是null。
如何排查?
在Editor 模式下,打开怀疑有问题的 BP,便会触发这个报错,如果有条件的话,可以写个脚步,把对象都加载一遍,便能看到这个报错了。如何解决?
删除这个变量 -> 重新创建 -> 类型修改为Object -> 点蓝图左上角的编译 -> 将默认值修改为 NULL -> 类型修改为Actor(你要的类型)
FPakPlatformFile 为空
- 表现:
FPakPlatformFile* HandlePakPlatform = (FPakPlatformFile*)(FPlatformFileManager::Get().FindPlatformFile(FPakPlatformFile::GetTypeName()));
if (!HandlePakPlatform)
{
UE_LOG(LogTemp, Warning, TEXT("FPakPlatformFile == NULL"));
}else
{
UE_LOG(LogTemp, Warning, TEXT("FPakPlatformFile is OK"));
}
在手机上输出为:
FPakPlatformFile == NULL
- 原因:
Unreal 的文件系统是个责任链模式,一环套一环,在初始化时,通过规则创建好,运行时通过 PlatformFileManager 来获取。如果在初始化时,某个 PlatformFile 没有满足条件,便不会被创建,在 PlatformFileManager 中便也 Find 不成功。 - 如何排查?
查看源代码,有两种情况会导致这种现象(源码在 LaunchEngineLoop.cpp 中的 LaunchCheckForFileOverride 方法中):- ProjectContentDir ,ProjectSavedDir,EngineContentDir 三目录下面没有 .pak 文件
- 运行参数里有 -NoPak 参数
-
最终定位问题为:在打包时,没有设置 -pak 参数,再加上项目里也没有手动添加 pak 文件,便触发了 ProjectContentDir ,ProjectSavedDir,EngineContentDir 三目录下面没有 .pak 的条件,导致初始化时 没有创建 FPakPlatformFile
Commandlet 模式下 AssetRegistryModule.Get().GetSubPaths 查找不到子目录
- 表现
指定目录下面有不少子目录,但是在Commandlet 模式下用 AssetRegistryModule.Get().GetSubPaths 死活都找不到,在 Editor 里是可以的。
看了相关代码,发现它是首先在 CachedPathTree 查找对于的根目录,然后在循环查找
void UAssetRegistryImpl::EnumerateSubPaths(const FString& InBasePath, TFunctionRef<bool(FString)> Callback, bool bInRecurse) const
{
EnumerateSubPaths(*InBasePath, [&Callback](FName Path)
{
return Callback(Path.ToString());
}, bInRecurse);
}
void UAssetRegistryImpl::EnumerateSubPaths(const FName InBasePath, TFunctionRef<bool(FName)> Callback, bool bInRecurse) const
{
CachedPathTree.EnumerateSubPaths(InBasePath, Callback, bInRecurse);
}
而 CachedPathTree 又在初始化时从配置表中读入
/** The tree of known cached paths that assets may reside within */
FPathTree CachedPathTree;
-
解决方案:
加入相应的查找目录
image.png
问题:开屏mp4播放黑屏
解决方案:
将视频格式设置为:视频格式: MP4 MPEG4编码