前言

最后的一章了,可以咸鱼了。

——qswwltn


嗯,其实说实在的,本来这个武器的生成没什么好讲的东西,毕竟这个真的没什么技术含量,不过嘛,入门嘛,就是要从基础开始讲起。不过呢,本文也准备结束了,以后有时间的话可以还会过来更新一些垃圾文章,还是请高手直接无视就行了。

对了,在这里说一下,如果按照我教程做完后如果出现不能重复打开编辑器的情况请使用独立进程来开启游戏,这个是因为内存中内容被重复添加/读取了,然后独立进程的话就不会有这个问题。

将数据保存到本地


现在,如果按照上面2章的教程做完的话已经是可以生成和保存武器信息到数据表中了,那么,现在就开始把数据保存到本地中了。

这里主要是使用2个类,一个是FPaths和FFileHelper,FPaths是用于读取游戏路径的,FFileHelper是虚幻引擎用来操作文件的类。这里我是要保存到游戏的Saved目录下,也就是你项目根目录的Saved文件夹。

这边的话还是推荐单独写一个函数(话说这种应该是面向对象开发的基础知识应该不用我多说吧?)方便以后使用。

至于为什么要用这个文件夹,当然是因为方便啊,因为FPaths类里已经内置了获取这个文件夹路径的函数了,当然,如果你不喜欢那还是有其他办法自定义的,等下会一起说。现在直接给出代码。

FString FileUrl = FPaths::ProjectSavedDir() + "\\ArmsData.json";

那个后面的是文件名,你可以自定义。

然后如果想自定义位置的话可以先获取游戏的目录后按游戏的目录来保存

FString FileUrl = FPaths::ProjectDir();    //获取项目根目录

这个你就自定义就行了,获取目录后要创建目录的话是和C/C++的操作差不多的,这边就不将了。

现在获取完目录后就可以来保存文件了,这边我是使用SaveStringToFile()这个函数来保存的,当然,还是有其他的函数来满足自定义的要求。

//从TArray中保存到文件
static bool SaveArrayToFile
(
    TArrayView < const uint8 > Array,
    const TCHAR * Filename,
    IFileManager * FileManager,    //如果不是必要,直接无视就好了
    uint32 WriteFlags     //如果不是必要,直接无视就好了
)

//从TArray类型中保存到文件
static bool SaveStringArrayToFile
(
    const TArray < FString > & Lines,
    const TCHAR * Filename,
    EEncodingOptions EncodingOptions,
    IFileManager * FileManager,
    uint32 WriteFlags
)

//从字符串中保存到文件
static bool SaveStringToFile
(
    FStringView String,
    const TCHAR * Filename,
    EEncodingOptions EncodingOptions,
    IFileManager * FileManager,
    uint32 WriteFlags
)

这边因为我们使用的是FString来保存JSON数据的,使用就直接使用SaveStringToFile()就行了。

FFileHelper::SaveStringToFile(Player->ArmsTable->GetTableAsJSON(EDataTableExportFlags::UseJsonObjectsForStructs), *FileUrl);

从本地读取到内存


读取的话获取路径的方式还是和前面的一样使用FPaths来获得路径,然后还是使用FFileHelper类来读取文件。

//读取文件到TArray中
static bool LoadFileToArray
(
    TArray < uint8 > & Result,
    const TCHAR * Filename,
    uint32 Flags
)

//读取文件到字符串
static bool LoadFileToString
(
    FString & Result,
    FArchive & Reader,
    EHashOptions VerifyFlags
)

//读取文件到字符串TArray中
static bool LoadFileToStringArray
(
    TArray < FString > & Result,
    const TCHAR * Filename
)

这边的话就不演示了。

结语


哎,终于做完了,之前因为自己在资料的时候总是找半天就突然想到要不要做个教程来给后面学的人来方便查找,然后就有了这个文章,不过嘛,毕竟我就一个垃圾小白也不是什么大佬,所以有问题的地方也欢迎来讨论,我在老王的群里ID是“犬山汪汪陆太郎”,文章里有什么实在看不懂的地方也是可以来问的,以后我还是会偶尔的来更新点内容,也是给这个网站填充点内容吧。那么,下次再见了