【问题标题】:Best way to save large amount of data locally in unity3D android? [closed]在unity3D android中本地保存大量数据的最佳方法? [关闭]
【发布时间】:2016-03-11 09:41:10
【问题描述】:

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

【问题讨论】:

  • 我会从 SQL 数据库开始...
  • 您能否详细说明,如何? @ŁukaszMotyczka
  • 嗨,这只是一个想法,我没有深入研究它,但我记得我有工作的 SQLite 数据库,我用 playerprefs 替换(我不需要存储太多数据)。请查看:forum.unity3d.com/threads/… 或在资产商店中寻找 SQLiter 是简单且免费的资产
  • 在 wiki 页面中的 SQLLite 上有更多信息:wiki.unity3d.com/index.php/SQLite。问题是代码是用 javascript 编写的,但只需稍加努力就可以轻松将其转换为 C#(或者您可能不需要)。无论如何,您都可以找到用于数据库管理的工作类以及如何使用它的示例代码:)
  • 为了清楚起见,如果您的项目少于一百万,则没有理由使用数据库。几千件绝对不算什么。您只需将其保存为任何类型的列表或字典,然后将其保存为带有一行代码的文本文件。

标签: android database unity3d


【解决方案1】:

注意 - 请勿出于任何原因使用“StreamWriter”。

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

这是 Unity 中常见的误解!

关于这个话题,多年来在 www 上传播了一个糟糕的示例代码。只需使用File.Write


关于这个页面上的问题,“数千”个条目绝对没有。

请注意,例如:您应用中的任何小图标图像都会使您的姓名/地址数据的大小完全相形见绌!

(1) 极易保存文本文件:

// 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。

在 Unity 中使用 Json 非常容易,stackoverflow 上有 100 多个示例。

示例https://stackoverflow.com/a/38535392/294884

(2) 一旦你说一百万个项目。可以学习使用本地SQL数据库,非常值得学习。按照 Łukasz Motyczka 在 cmets 中所说的去做。

(3) 永远不要使用 PlayerPrefs - 它更加困难和混乱!

【讨论】:

    【解决方案2】:

    对于因为试图访问 Application.StreamingDataPath(或 APK 中的任何其他内容)而来到这里的任何其他人,您不能像 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();
    }
    

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

    【讨论】:

    • 嗨 Seamus - 这个问题的 OP(非常简单)只想写入,然后读取一些数据。 (仅供参考,在 cmets 中对此进行了相当多的讨论,现在已经消失了!)正如我的回答中所述,这只是一行代码。几乎每场比赛都这样做——这没什么,完全是微不足道的。 Seamus 的示例在这里解释了如何从“您随应用安装发送的包”中加载(我敢肯定对某些读者非常有用)。
    【解决方案3】:

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

    【讨论】:

    • 是的,我阅读了您的问题.. 另一种使用文件存储大数据的简单方法。您将一堆数据存储在文件中(例如:-文本文件)。在 Unity 中使用文件 I/O 轻松写入数据。
    • @JoeBlow 很抱歉没有响应。我离开了那个项目。很紧急,没时间做实验。
    猜你喜欢
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多