1、问题来源

  最近的项目里面有个需求,要在打包之后的exe或者apk运行起来后访问工程Content或者安卓目录下的非Asset文件,比如text文件,json文件等,从中读取一些可随时修改的配置项信息。但是这些没法直接被UE平台序列化存储,因此需要做一点点额外的操作来实现我们的目标,假设工程目录Content里面有个Json目录,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右边点击加号,在新增的一行右侧点击"..."标记,新增一条路径指向Conent目录下的Json文件夹。

  打包一下,文件夹里面显示我们的Json/A.json已经作为独立文件成功打包到WindowsNoEditor目录下。

  写几行测试一下看看行不行,假设我要蓝图里面读A.json,C++封装函数如下,其实主要是要通过FPaths::ConvertRelativePathToFull(FPaths::ProjectContentDir()) + JsonName拼接得到A.json的正确绝对路径:

 1 bool UJsonOperator::FindValueWithGivenProperty(FString JsonName, FString FieldName, FString& Val)
2 {
3 FString AbsoluteJsonPath = FPaths::ConvertRelativePathToFull(FPaths::ProjectContentDir()) + JsonName;
4 if (FPlatformFileManager::Get().GetPlatformFile().FileExists(*AbsoluteJsonPath)) {
5 UE_LOG(MiniFileReaderLog, Warning, TEXT("%s"), *AbsoluteJsonPath); // do not call UKismetSystemLibrary::PrintString in static function
6
7 FString JsonData;
8 FFileHelper::LoadFileToString(JsonData, *AbsoluteJsonPath);
9
10 /* convert fstring to json object. */
11 TSharedRef<TJsonReader<>> JsonReader = TJsonReaderFactory<>::Create(JsonData);
12 TSharedPtr<FJsonObject> RootJsonObj = MakeShareable(new FJsonObject);
13
14 if (FJsonSerializer::Deserialize(JsonReader, RootJsonObj)) {
15 UE_LOG(MiniFileReaderLog, Warning, TEXT("Json Data: %s"), *JsonData);
16
17 TSharedPtr<FJsonValue> Member = RootJsonObj->TryGetField(FieldName);
18 if (Member) {
19 Val = Member->AsString();
20 UE_LOG(MiniFileReaderLog, Log, TEXT("Property [%s], Value: %s"), *FieldName, *(Member->AsString()));
21 }
22 else {
23 UE_LOG(MiniFileReaderLog, Warning, TEXT("Property [%s] specified not exists."), *FieldName);
24 return false;
25 }
26 }
27 else {
28 UE_LOG(MiniFileReaderLog, Warning, TEXT("FJsonSerializer::Deserialize Failed!"));
29 return false;
30 }
31 }
32 else {
33 UE_LOG(MiniFileReaderLog, Error, TEXT("File : %s not exists."), *JsonName);
34 return false;
35 }
36 return true;
37 }

3、Android平台

  Android平台略有不同,UE工程发布到安卓设备并启动之后,会在安卓设备的/storage/emulated/0/UE4Game目录下新建一个和UE Project Name的同名目录。该目录存放程序的运行数据,此处工程名假设为FunctionProject

  第一步,在运行数据目录新建Json/A.json,如下所示,里面存放程序需要读取的属性数据信息。

  第二步,写一段示例代码读取到该目录下的A.json文件,如下所示:

bool UJsonOperator::LoadRawContentsToString(FString FileName, FString& FileContents)
{
#if PLATFORM_ANDROID
extern FString GFilePathBase;
FString tmp = GFilePathBase + FString("/UE4Game/") + UKismetSystemLibrary::GetGameName() + FString("/") + FileName;
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, FString::Printf(TEXT("%s"), *tmp));
return FFileHelper::LoadFileToString(FileContents, *tmp);
#else
const FString ThePath = FPaths::ConvertRelativePathToFull(FPaths::ProjectContentDir());
UE_LOG(MiniFileReaderLog, Log, TEXT("Json Path: %s"), *(ThePath + FileName));
return FFileHelper::LoadFileToString(FileContents, *(ThePath + FileName));
#endif
}

  此处,UKismetSystemLibrary::GetGameName()就是获取UE4Game目录下的APP发布名称,可以理解为Android APP运行数据的根目录,函数传入参数的第1个参数FileName为Json/A.json,那么最终拼接得到的A.json绝对路径为:

/storage/emulated/0/UE4Game/FunctionProject/Json/A.json

  拿到这个绝对路径,就可以读取文件内容了,到此结束!

UE4打包发布后,在Windows和Android平台上访问非Asset文件的更多相关文章

  1. VUE打包发布后无法访问js、css资源

    在vue开发中,本地测试以及测试环境中都没有遇到问题,当发布生产,有虚拟路径时,便出现js.css均报错404: 首先在config的index.js文件中,将assetsPublicPath修改为' ...

  2. Vue项目打包发布后CSS中的背景图片不显示

    相信有很多同学在学习vue的刚开始都遇到过项目打包发布后发现CSS中的背景图片不显示,具体如何解决只需要更改bind的配置即可 修改 build/utils.js 中的 generateLoaders ...

  3. 如果项目在IIS发布后,出现System.ComponentModel.Win32Exception: 拒绝访问。

    如果项目在IIS发布后,出现System.ComponentModel.Win32Exception: 拒绝访问. 那么就试试下面的办法. 步骤如下: 应用程序池=>设置应用程序池默认设置 将标 ...

  4. Qt在Android平台上实现html转PDF的功能

    Qt for Android Qt for Android enables you to run Qt 5 applications Android devices. All Qt modules ( ...

  5. 随笔之Android平台上的进程调度探讨

    http://blog.csdn.net/innost/article/details/6940136 随笔之Android平台上的进程调度探讨 一由来 最近在翻阅MediaProvider的时候,突 ...

  6. (转) Android平台上关于IM的实践总结

    前言 IM通信在互联网发展到现在已经是码农的世界里人尽皆知的技术,特别在当下移动互联网迅猛发展的时代这种技术的开发也更加火热,其中老牌的代表作就有QQ和MSN,和最近新崛起的微信,默默,易信,来往等眼 ...

  7. Android平台上最好的几款免费的代码编辑器

    使用正确的开发工具能够快速有效地完成源代码的编写和测试,使编程事半功倍.在网络信息高速发展的今天,移动设备的方便快捷已经深入人心,越来越多的程序员会选择在任何感觉舒适的地方使用移动设备查看或者编辑源代 ...

  8. unity3D开发的程序发布到Android平台上进行运行测试的详细步骤

    第一步    下载安装JDK 和SDK 1.需要配置java环境.点击链接进入ava的配置的方法:http://www.cnblogs.com/Study088/p/7496158.html 2.下载 ...

  9. [原]详解如何将cocos2dx项目编译到Android平台上的(方式一:Cywin+NDK)

    链接地址:http://m.blog.csdn.net/blog/yhc13429826359/29357815 2014-6-8阅读578 评论0 前言:cocos2dx作为一个开源的移动2D游戏框 ...

  10. OpenCV在Android平台上的应用

    今年8月份, OpenCV 2.3.1发布了. 虽然从2.2开始, OpenCV就号称支持Android平台, 但真正能让OpenCV在Android上运行起来还是在2.3.1版本上. 在这个版本上, ...

随机推荐

  1. shell 调试方法

    shell 在 linux 系统中比较常见,简单的脚本可以看着确实没难度,但是当脚本功能复杂后,看起来就不那么流畅了,所以掌握一些调试方式还是很有必要的,这里我收集了一次常用的调试方式. shell调 ...

  2. [Python急救站]基于Transformer Models模型完成GPT2的学生AIGC学习训练模型

    为了AIGC的学习,我做了一个基于Transformer Models模型完成GPT2的学生AIGC学习训练模型,指在训练模型中学习编程AI. 在编程之前需要准备一些文件: 首先,先win+R打开运行 ...

  3. Spring学习一(依赖注入/Bean/注解等)

    1.Spring依赖注入的方式. 2.依赖注入的类型 3.Bean的作用域 4.自动注入 5.使用注解的方式 6.在spring配置文件中引入属性文件 1.Spring依赖注入的方式 平常的java开 ...

  4. ide构建SpringMVC框架

    框架原理图如下: 1. 创建如图项目 2. 在lib中所需导入jar包 3. 配置变量 (1) (2)add library (3)选择web app libraries 4. 配置web.xml文件 ...

  5. RAC关闭【Oracle 10g】

    顺序:关闭监听->关闭实例->关闭服务->关闭软件 1.关闭监听 进入节点1,[oracle@arprac01 ~]$lsnrctl stop 进入节点2,[oracle@arpra ...

  6. 【进阶篇】基于 Redis 实现分布式锁的全过程

    目录 前言 一.关于分布式锁 二.RedLock 红锁(不推荐) 三.基于 setIfAbsent() 方法 四.使用示例 4.1RedLock 使用 4.2setIfAbsent() 方法使用 五. ...

  7. node.js环境在Window和Mac中配置,以及安装cnpm和配置Less环境

    Node.js 和cnpm安装 最近准备学习vue.js,但首先需要配置电脑的环境.配置node.js. 1.在node(https://nodejs.org/en/)官网上下载安装node.js,两 ...

  8. C语言:贮油点建设问题(详解题目意思)

    !!!!先看解析,后面附有代码!!!!!!! ,希望大家不懂的能认真看看,这些都是我在写的过程中不能理解,遇到的困难,然后弄懂之后总结出来给大家的,想学的一定要认真看完. 规律是: 贮油点之间相差50 ...

  9. 数据库中存储bool对象的数据,使用Bit和Integer有什么区别,性能上有多大的差异

    在数据库中存储布尔(Boolean)值时,常见的两种选择是使用 BIT 类型或 INTEGER 类型.两者在存储.性能和使用上的区别如下: 1. BIT 类型 存储:BIT 类型专门用于存储布尔值.通 ...

  10. .NET ASPIRE 预览版 7 发布

    .NET Aspire 预览版 7 并不是原计划的一部分,此预览版有很多重大 API 更改,部分原因是一旦产品发布,我们将致力于稳定的 API 表面.可以说,Aspire团队希望确保在最终发布之前完成 ...