在 Unity 游戏中保存数据的最佳方法 [关闭]

Posted

技术标签:

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

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

【问题讨论】:

docs.unity3d.com/Manual/JSONSerialization.html docs.unity3d.com/ScriptReference/PlayerPrefs.html(请参阅youtu.be/gM73B5PyGh8 寻求帮助)、docs.mongodb.com/realm/sdk/dotnet/unity(请参阅youtu.be/8jo_S02HLkI)和许多其他人:) 【参考方案1】:

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

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

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

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

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

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

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

    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,我会修改它...跨度>

以上是关于在 Unity 游戏中保存数据的最佳方法 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

保存游戏状态的最佳方法是啥?

对 Unity 项目执行版本控制的最佳方法 [关闭]

什么是在 Unity3D 制作的游戏中保存游戏进度的最佳实践,以及适用于 Android 和 iOS 的不同版本

unity游戏退出发http

在 Unity Billiard 游戏上实现多人游戏的最佳方法是啥?

使用 Unity 开发的最佳语言? [关闭]