在unity3D android中本地保存大量数据的最佳方法?

时间:2016-03-11 09:41:10

标签: android database unity3d

我正在制作2D游戏,稍后将其用作摊位上的广告活动,我需要存储用户信息,姓名,号码,电子邮件和分数。数据可能超过数千个条目。在unity5中实现它的最佳和免费方式是什么?游戏将部署在Android上。

3 个答案:

答案 0 :(得分:4)

注意 - 不要出于任何原因使用“StreamWriter”。

只需使用简单的File.Write命令。

这是Unity中极为常见的误解!

Unity中存在一个很大的问题,人们在网上看到完全错误的示例代码,而且荒谬的问题会在几年内传播开来。永远不要使用“StreamWriter” - 只需使用简单的File.Write函数。不可能更容易。

关于上述问题:“数以千计”的条目绝对没有。 (应用程序中任何不相关的小图标图像都会使您的名称/地址数据的大小相形见绌。)

(1)你可以保存一个文本文件,

在Unity中编写和读取文件非常容易。

// IO crib sheet..
// filePath = Application.persistentDataPath+"/"+fileName;
// check if file exists System.IO.File.Exists(f)
// write to file File.WriteAllText(f,t)
// delete the file if needed File.Delete(f)
// read from a file File.ReadAllText(f)

这就是它的全部内容。

   string currentText = File.ReadAllText(filePath);

注意好............

// filePath = Application.persistentDataPath+"/"+fileName;
// YOU MUST USE "Application.persistentDataPath"
// YOU CANNOT USE ANYTHING ELSE
// NOTHING OTHER THAN "Application.persistentDataPath" WORKS
// ALL OTHER OPTIONS FAIL ON ALL PLATFORMS
// YOU CAN >ONLY< USE Application.persistentDataPath IN UNITY

您可以将信息存储为任何格式,例如JSON或csv。由于您拥有少量信息,因此您可以轻松地将json保留为List并轻松访问它。

请注意,如果您不熟悉非常基本的编程任务,例如使用JSON或csv(非常简单),您将需要研究它。所以问题/答案不能成为教程。

(2)您可以了解如何使用本地 SQL数据库,这非常值得学习。做ŁukaszMotyczka在评论中说的话。

(3)你的任务确实很小,你可以使用PlayerPrefs。但请注意这实际上是最困难的方法!这将是一个真正的混乱,试图将PlayerPrefs用作一个简单的数据库。所以不要这样做。

(4)请注意,实际上这些天没有“本地应用程序”。成为“应用程序开发人员”是成为云开发人员,可能需要使用Firebase等(Parse今年出人意料地关闭了!)

答案 1 :(得分:2)

对于其他任何人来到这里是因为他们试图访问Application.StreamingDataPath(或者其他任何内容),你不能简单地使用Fattie的回复中讨论的File api。您需要使用Web请求,因为APK本质上是一个压缩文件夹,System.IO无法访问这些包的内部。

您需要使用UnityWebRequest从PKG中的所需位置获取数据。您可以通过在项目中的任何位置添加文件夹并将其称为StreamingAssets(资源文件夹在APK中重建并且无法直接访让游戏开始非常缓慢),然后将你的UWR指向Application.streamingDataPath并从request.downloadHandler.data获取数据。

为了保存新数据,你必须使用Application.persistantDataPath,此时使用System.IO.File就可以了。

以下是从APK!/ assets /文件夹中获取数据的示例(android放置StreamingAssets文件夹),然后将其保存到某个位置供以后使用。

public IEnumerator GetSomeDataAndThenSave(string path)
{
    UnityWebRequest request = UnityWebRequest.Get(path);

    request.Send();

    while(!request.isDone)
    {
        yield return null;
    }

    if (!request.isNetworkError && (request.responseCode == 0 || request.responseCode == (long)System.Net.HttpStatusCode.OK))
    {
        WrapperClass yourClassList = new WrapperClass();
        YourClassList.members = JsonUtility.FromJson<YourClass>(request.downloadHandler.text);

        var bytes = System.Text.Encoding.UTF8.GetBytes(JsonUtility.ToJson(instance));
        File.WriteAllBytes(Application.persistentDataPath + "/SubDirectory/" + Path.GetFileName(path), bytes);
    }

    request.Dispose();
}

希望能为其他遇到同样问题的人解决问题。

答案 2 :(得分:0)

您使用PlayerPrefs(Key,Value)在Unity中存储数据。它是Unity中存储数据的简单方法之一。