一, 非资源型文件的打包拷贝:
非常重要的一环是非资源型的文件默认是不被打包拷贝的,如果你需要把这些文件随同包体一同打包,就需要额外的配置,关于这种配置的博客也有前人说过了,这里在赘述一下:
你可以通过Project Settings->Packaging找到相关配置选项。
Additional Asset Directories to Cook :这类适用于资源型文件没有被引用,但需要被Cook的情况,比如说:有一些资源没有被引用,但以后你需要动态创建调用它,你就需要考虑把它配置到该选项里。
Directories to never cook:这个在官方标注中和上一个类似,但没有尝试并不知道有什么区别
重要说明的两个配置项:
Additional Non-Asset Directories to Package: 这个是非资源型文件要添加到Pak包体里面随同打包的配置,也就是说,这个文件夹不管是不是资源型文件,是不是被引用,但打包时一定要随同打包,
作为Pak的一部分(请注意:这个一部分很重要,以后会说明),这些文件大多是被UE4 的文件系统API来读取调用的文件。
Additional Non-Asset Directories to Copy :这个是非资源型文件在打包时一定要被复制到应用里的文件,这些文件不作为Pak的一部分(这个一部分也很重要,和上面的一个是对应的),当然,这些文件
是你个人手动加载的,并不是通过UE4文件系统,比如说:一些第三方的库文件执行内部的IO文件。
二,执行加载过程:
为什么反复强调Pak内外的问题?
那是因为内外的资源文件路径差别很大,最终有可能导致你的资源读取失败,我们知道Pak包是需要手动加载的,而且它内部也维护了资源文件的路径层,这就导致了路径变更,没法通过正常的
读取方法来读取了。比如说在IOS中,如果你把这些非资源型文件打到了包内,那么你会得到一个类似于这样的一个路径:Pak:../../../[Project_name]/content/paks/[Project_name]-ios/../../../
[Project_name]/content/non-asset(这个路径是通过后面的路径函数得到的),这个路径是Pak包体附加一层的路径。
能不能在后两种配置目录里同时配置一个文件目录?
显然是不能的(至少我尝试的没有起到作用,对于最后的copy来说),因为最终得到的是Pak的双层路径,也就是并没有copy而是陪同资源型文件打到Pak里了。
三,IOS包外读取Pak外Non-Asset型文件:
首先你需要在Additional Non-Asset Directories to Copy目录里配置你的资源目录。
第二步就是关于路径函数读取部分了,IOS路径读取是需要几步转换操作的,例如:
FString GetIOSGameContentDirectory( const FString & FilePath )
{
FString path = FPaths ::ConvertRelativePathToFull( FilePath );
FString diskpath = IFileManager ::Get().GetFilenameOnDisk( * path);
FString abspath = IFileManager ::Get().ConvertToAbsolutePathForExternalAppForRead( * diskpath);
return abspath;
}
你需要在头文件里包含FileManager.h和Paths.h头文件
剩余的具体该怎么读就可以按正常的流程走了,这里不再赘述。(关键的部分在路径读取和资源配置上)