我打算用Unity3D开发一款游戏。我没有选择yed,如果它将在javascript,c#脚本或boo,作为unity IDE提供的开发语言。
在我的游戏中,我需要存储游戏状态:用户名,等级,游戏动作,当前状态,积分和所有应该保存的东西。我想让用户在一定的时间内保存游戏,比如说几个小时后,当他想继续游戏时,他将能够从他停止的地方加载游戏。
所以我知道,也许我需要2个表,一个是用户数据,另一个是每个游戏的表--用来保存游戏状态。
但我想知道是否有任何选项可以添加一个本地DB到Unity中?
我看到了这个 教程 它描述了如何序列化对象以保存游戏状态... 但我不知道这是否能满足我的游戏需求。
你可以看看 这个统一的答案 以获得使用sqlite的一些帮助。
然而在大多数情况下,我会使用序列化而不是本地数据库。
数据库的优点是你可以很容易地搜索你的数据。
序列化的优点是,你可以按照你想要的方式来制作你的类结构,并且不需要任何适配器和解析就可以直接加载它。
如果我有大量的数据,比如数千行,我会使用数据库。或者如果我的数据有复杂的关系,即很多表之间有关系。否则,我认为使用序列化更容易,更省事。
请到这里查看一个对我有效的解决方案。https:/medium.com@rizasif92sqlite-and-unity-how-to-do-it-right-31991712190。
其中引用并包含这个GitHub sqllite-unity-plugin。https:/github.comrizasifsqlite-unity-plugin。
使用的代码是这样的。
using UnityEngine;
using System.Data;
using Mono.Data.Sqlite;
using System.IO;
public class SqliteTest : MonoBehaviour {
// Use this for initialization
void Start () {
// Create database
string connection = "URI=file:" + Application.persistentDataPath + "/" + "My_Database";
// Open connection
IDbConnection dbcon = new SqliteConnection(connection);
dbcon.Open();
// Create table
IDbCommand dbcmd;
dbcmd = dbcon.CreateCommand();
string q_createTable = "CREATE TABLE IF NOT EXISTS my_table (id INTEGER PRIMARY KEY, val INTEGER )";
dbcmd.CommandText = q_createTable;
dbcmd.ExecuteReader();
// Insert values in table
IDbCommand cmnd = dbcon.CreateCommand();
cmnd.CommandText = "INSERT INTO my_table (id, val) VALUES (0, 5)";
cmnd.ExecuteNonQuery();
// Read and print all values in table
IDbCommand cmnd_read = dbcon.CreateCommand();
IDataReader reader;
string query ="SELECT * FROM my_table";
cmnd_read.CommandText = query;
reader = cmnd_read.ExecuteReader();
while (reader.Read())
{
Debug.Log("id: " + reader[0].ToString());
Debug.Log("val: " + reader[1].ToString());
}
// Close connection
dbcon.Close();
}
// Update is called once per frame
void Update () {
}
}