【问题标题】:Best way to save data in Unity game [closed]在 Unity 游戏中保存数据的最佳方法 [关闭]
【发布时间】:2015-12-23 00:06:20
【问题描述】:

我想知道...在 Unity 游戏中保存数据的最佳方式是什么。 JSON?如果是这样,怎么做?谢谢

【问题讨论】:

标签: json unity3d persistence unity5 saving-data


【解决方案1】:

以下是为 Unity 项目保存数据的一些不同方式和方法

  1. 平台无关:以平台无关的方式在 Unity3D 中保存数据的一种方法是使用 PlayerPrefs 类。 (了解详情12)。 PlayerPrefs 是一个静态类,非常好用但不可靠。

  2. 持久性 - 保存和加载数据 使用 DontDestroyOnLoadPlayerPrefs 和数据序列化 Video Tutorial by unity

  3. 服务器端:您还可以使用服务器来保存数据(如 PHP 和 MySQL 数据库的组合)。您可以使用它来保存分数数据、用户资料等,了解更多来自Unity Wiki

  4. 要将游戏内数据以以后可以理解和加载的格式保存到硬盘,请使用称为序列化的 .NET/Mono 功能. Learn More

  5. 关于 Unity 的简单 JSON 指南可在 Unity Wiki 或官方查看 JSON serialization

  6. SQLite您的应用程序的嵌入式数据库)是您获得Free Package 的另一个不错的选择,它简单且如果您了解 SQL,则很容易(也是我最喜欢的)。

  7. Scriptable Object: 它是一个数据容器。对于不变的数据很有用。适用于大型不变数据和惊人的安全项目内存。

以上摘自我的blog post on Data Saving Techniques for Unity3d Applications

【讨论】:

  • 假设我有几个事件一个接一个地通过网络服务器不时更新,并将所有事件数据保存在设备中,我应该使用什么?可以序列化,保存所有事件的数据并稍后更新数据吗?我所看到的只是保存和加载,并且在序列化教程中没有编辑或更新。它会清理旧数据以保存新数据吗?
  • @Zoedia 我想你最好单独提出一些重要细节的问题。所以也许我能理解和回答
  • 很好的答案只是遗憾地看到#1 项目玩家偏好这导致人们将数据保存在那个不安全的地方。但答案仍然非常明确。
  • @JeroenDeClercq #1 是统一应用程序中最容易保存数据的。不知道是不是不安全。
  • 如果有人想在没有第三方库的情况下走JSON路线,Unity有一些官方的JSON序列化工具docs.unity3d.com/Manual/JSONSerialization.html
【解决方案2】:

您可以使用资产商店中免费和付费的许多资产。

Save Game Free - XML 和 JSON 保存和加载。

语法:

Saver.Save<T> (T data, string fileName);

例子:

Saver.Save<MyData> (myData, "myData"); // The .json extension will be added automatically

Save Game Pro - 二进制保存和加载。快速且安全。易于使用。

语法:

SaveGame.Save<T> (T data, string identifier);

例子:

SaveGame.Save<int> (score, "score");

【讨论】:

    【解决方案3】:

    如果您想将数据存储在服务器中,PHP 和 MySQL 有一个简单的方法。你要做的是:

    第 1 步:
    只需在单个字符串中从服务器获取您想要的任何数据(代码如下):

    <?php
    
    //SERVER CONNECTION 
    $server_name = "localhost";
    $server_user = "Er.Ellison";
    $server_pass = "supersecretPassword";
    $server_db   = "game_test_db";
    
    $connection = new mysqli($server_name , $server_user , $server_pass , $server_db);
    if(!$connection) {
      die("Connection failed !" . mysqli_connect_error());
    }
    
    // QUERY
    $query = "SELECT * FROM items";
    $result = mysqli_query($connection , $query);
    
    if(mysqli_num_rows($result) > 0){
      while($row = mysqli_fetch_array($result)){
        echo "id:" . $row['id'] . "|username:" . $row['username'] . "|type:" . $row['type'] . "|score:" . $row['score'] . ";";
      }
    } 
    ?>
    

    请注意,您必须使用 ; 分隔您想要的任何字符串或任何你觉得舒服的东西,并记住我们将在 Unity 的 C# 中使用它。

    第 2 步:
    现在您应该像这样从您的网络获取数据(这将是一个长字符串):

    第 3 步:
    现在转到 Unity 并创建一个 C# 脚本并将其附加到场景中的任何对象并打开脚本,然后使用这种代码来操作您从数据库中检索到的数据:

    public class DataLoader : MonoBehaviour {
    
    
    public string[] items;
    
    
    // Use this for initialization
    IEnumerator Start () {
        WWW itemsData = new WWW ("http://localhost/_game/test/itemsdata.php");  
        yield return itemsData;
        string itemsDataStrign = itemsData.text;
        print (itemsDataStrign);
        items = itemsDataStrign.Split (';');
        print (GetDataValue(items[0] , "cost:"));
    }
    
    string GetDataValue(string data, string index) {
        string value = data.Substring (data.IndexOf(index) + index.Length);
        if (value.Contains ("|")) {
            value = value.Remove (value.IndexOf("|"));
        }
        return value; 
    }
    
    }
    

    第 4 步:
    您刚刚从数据库中检索数据,从统一控制台检查图像:

    我是为那些可能像我一样陷入数据库问题的人制作的!

    【讨论】:

    • 我认为您的代码(三个实例)中的 $reuslt 是一个错字。
    • 顺便说一下,当您看到发给您的邮件时,请务必回复。我已经对这个问题投了反对票,一旦你回答了我就会取消投票。请愿意在必要时进行编辑,以使未来的读者受益。
    • sorry sorry sorry sorry,我刚刚在做一个非常严肃的项目,有空就过来这里,顺便说一下thanx for editor,我会修改它...跨度>
    猜你喜欢
    • 2010-09-23
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多