Unity 之 抖音小游戏本地数据最新存储方法分享
一、抖音小游戏文件存储系统背景
官方文档:使用新文件系统说明,
内容包括了:
- 新文件系统的背景
- 已有存档文件迁移方法:
- 数据对比:在老文件系统上写入约400MB的文件后,打开游戏后占用内存约1G,在迁移后则基本不会再占用内存,游戏内存将至630MB左右
在原有实现中,C#标准的文件接口,如File.ReadAllText、File.WriteAllText、FileStream
等,是将数据写入到内存文件系统,然后再在合适的时机自动同步内存数据到IndexedDB中存储。由于采用了IndexedDB文件存储系统,使得运行时内存有一定的增加,如果文件数量过多,可能会发生闪退。
另外,IndexedDB文件存储系统兼容性不够好,在部分iOS系统上会无法正常使用,从而导致无法正常进入游戏的情况。所以我们提供 StarkFileSystemManager
接口作为替换,开发者可以通过调用StarkSDKSpace.StarkSDK.API.GetStarkFileSystemManager()
方法来使用新的文件存储系统。
二、文件存储系统的使用方法
2.1 初始化
在使用文件系统时,我会习惯性的做一个初始化:首先需要获取文件系统管理器对象StarkFileSystemManager
,然后获取到一个用户数据存储的路径StarkFileSystemManager.USER_DATA_PATH
。
后面的文件相关操作都要在 dyFileSystem
,dyFilePath
两个变量的基础上进行操作。
初始化参考代码如下:
using StarkSDKSpace;
public class StarkSDKTest : MonoBehaviour
{
// 抖音存储文件系统
private StarkFileSystemManager dyFileSystem;
// 用户数据存储的路径
private string dyFilePath;
void Start()
{
dyFileSystem = StarkSDK.API.GetStarkFileSystemManager();
dyFilePath = StarkFileSystemManager.USER_DATA_PATH;
}
}
2.1 创建目录
创建目录有同步和异步两种写法:
同步方法:MkdirSync(string dirPath, bool recursive = false);
dyFileSystem.MkdirSync(dicPath, false);
:
- 第一个参数表示:创建的目录路径,注意:地址要以上面获取的 dyFilePath 作为根目录。
- 第二个参数表示:是否在递归创建该目录的上级目录后再创建该目录。如果对应的上级目录已经存在,则不创建该上级目录。
示例代码:
void CreateDic(string dicPath)
{
// 判断文件是否存在
if (!dyFileSystem.AccessSync(dicPath))
{
string isSucc = dyFileSystem.MkdirSync(dicPath, false);
Debug.Log($"创建目录成功状态:{isSucc} 为空,则表示创建成功");
}
else
{
Debug.Log($"已经存在此目录:{dicPath}, 无需再次创建");
}
}
异步方法 Mkdir(MkdirParam param)
参数与同步方法一致,可添加创建成功或失败回调。
void CreateDicAsync(string dicPath)
{
if (!dyFileSystem.AccessSync(dicPath))
{
MkdirParam param = new MkdirParam();
param.dirPath = dicPath;
param.recursive = false;
param.fail = delegate(StarkBaseResponse response)
{
Debug.Log($"异步创建目录失败,失败原因: errCode:{response.errCode} , errMsg:{response.errMsg}");
};
param.success = response =>
{
Debug.Log($"异步创建目录成功,执行成功回调。");
};
dyFileSystem.Mkdir(param);
}
else
{
Debug.Log($"已经存在此目录:{dicPath}, 无需再次创建");
}
}
若创建失败,则可根据errMsg进行修改,若不清楚如何修改可以使用errCode和官方文档进行比较。
官方文件系统文档地址
2.3 存储数据
涉及知识点:
- 写入文件
可以写入字符串string
或者 字节数组byte[]
两种类型,也有同步异步两种方式。 - 读取文件
写入时用的什么类型存储,读取时就使用使用类型。字符串方式写入默认编码格式为utf8
。 - 校验文件/目录是否存在
同步写法参考代码如下:
/// <summary>
/// 存储数据
/// --> 不存在,创建并写入
/// --> 已存在,读取并写入
/// PS:地址要以上面获取的 dyFilePath 作为根目录,后面则可自行创建
/// </summary>
/// <param name="filePath">文件存储地址</param>
/// <param name="fileContext">文件存储内容</param>
void CreateFile(string filePath, string fileContext)
{
if (!dyFileSystem.AccessSync(filePath))
{
string isSucc = dyFileSystem.WriteFileSync(filePath, fileContext, "utf8");
Debug.Log($"创建文件成功状态:{isSucc} 为空,则表示创建成功");
}
else
{
// 读取并写入 --> 注意编码格式与创建一致
string readContext = dyFileSystem.ReadFileSync(filePath, "utf8");
Debug.Log($"读取文件内容:{readContext}");
string isSucc = dyFileSystem.WriteFileSync(filePath, readContext + fileContext);
Debug.Log($"读取并写入:{filePath}, 无需再次创建");
}
}
2.4 删除目录/文件
dyFileSystem.RmdirSync(delPath, false);
:
- 第一个参数表示:删除目录/文件的路径。
- 第二个参数表示:是否递归删除目录。如果为 true,则删除该目录和该目录下的所有子目录以及文件。为false则删除指定目录/文件。
// 删除文件/目录
void DeleteFileOrDic(string delPath)
{
if (dyFileSystem.AccessSync(delPath))
{
// 第二个参数表示:是否递归删除目录。如果为 true,则删除该目录和该目录下的所有子目录以及文件
string isSucc = dyFileSystem.RmdirSync(delPath, false);
Debug.Log($"删除文件/目录成功状态:{isSucc} 为空,则表示删除成功");
}
else
{
Debug.Log($"不存在此文件/目录:{delPath}, 无需删除");
}
}
2.5 其他相关操作
复制文件:也同样有同步和异步两种方法,使用方式和上面基本一致
重命名文件:
三,小结
抖音小游戏文件存储系统是一个非常重要的组成部分,它提供了一种简单、可靠的方式来存储和管理小游戏中的数据。此文件存储系统支持存储和读取文本、JSON、二进制等类型的数据,并提供了多种 API 来实现数据的存储和访问。
在开发抖音小游戏时,可以使用抖音小游戏文件存储系统来实现数据的存储和访问,从而提高小游戏的性能和用户体验。