在 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 是一个静态类,非常好用但不可靠。
持久性 - 保存和加载数据 使用 DontDestroyOnLoad、PlayerPrefs 和数据序列化 Video Tutorial by unity。
服务器端:您还可以使用服务器来保存数据(如 php 和 mysql 数据库的组合)。您可以使用它来保存分数数据、用户资料等,了解更多来自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 游戏中保存数据的最佳方法 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
什么是在 Unity3D 制作的游戏中保存游戏进度的最佳实践,以及适用于 Android 和 iOS 的不同版本