【发布时间】:2015-12-23 00:06:20
【问题描述】:
我想知道...在 Unity 游戏中保存数据的最佳方式是什么。 JSON?如果是这样,怎么做?谢谢
【问题讨论】:
标签: json unity3d persistence unity5 saving-data
我想知道...在 Unity 游戏中保存数据的最佳方式是什么。 JSON?如果是这样,怎么做?谢谢
【问题讨论】:
标签: json unity3d persistence unity5 saving-data
以下是为 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。
【讨论】:
您可以使用资产商店中免费和付费的许多资产。
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");
【讨论】:
如果您想将数据存储在服务器中,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 是一个错字。