1、问题来源
最近的项目中有一个需求,要求在打包后的exe或apk文件运行时,访问工程Content或者安卓目录下的非Asset文件,如text文件、json文件等,以读取一些可随时修改的配置项信息。由于这些文件无法直接被UE平台序列化存储,因此需要进行一些额外的操作来实现这一目标。假设工程目录Content中有一个Json目录,里面有一个A.json文件,程序在运行时需要读取A.json。
下面将分别讨论在Windows和Android平台上如何实现这一需求。
2、Windows平台
第一步,在Project Settings->Project->Packaging下,取消勾选Use Pak File。因为如果打包成.pak文件,Content目录下的所有资源(Asset文件或Non-Asset文件)都会被打包进一个.pak文件,后期无法随时修改。
第二步,在Project Setting顶部搜索asset,在Additional Non-Asset Directories to Package右侧点击加号,新增一条路径指向Content目录下的Json文件夹。
打包后,文件夹里显示Json/A.json已经作为独立文件成功打包到WindowsNoEditor目录下。
接下来可以编写测试代码,例如在蓝图中读取A.json,或者使用C++封装函数通过FPaths::ConvertRelativePathToFull(FPaths::ProjectContentDir()) + JsonName拼接得到A.json的正确绝对路径。
3、Android平台
在Android平台上稍有不同。当UE工程发布到安卓设备并启动后,会在安卓设备的/storage/emulated/0/UE4Game目录下新建一个与UE Project Name同名的目录,用于存放程序的运行数据。假设工程名为FunctionProject。
第一步,在运行数据目录新建Json/A.json,里面存放程序需要读取的属性数据信息。
第二步,编写示例代码读取该目录下的A.json文件。
在代码中,UKismetSystemLibrary::GetGameName()用于获取UE4Game目录下APP发布名称,可以理解为Android APP运行数据的根目录。函数传入参数的第一个参数FileName为Json/A.json,最终拼接得到A.json的绝对路径。
拿到这个绝对路径,就可以读取文件内容了,到此结束!