将类信息存储在字典或类似的东西中

时间:2016-07-11 02:52:33

标签: c# unity3d

我很抱歉,如果这是一个重复的问题,但我做了一个搜索,但无法找到我正在寻找的信息。如果您也知道要引用的问题,请链接我!

但无论如何,我有一个创建类的函数

private Item CreateItem(string name, bool stackable, int amount, string discription)
{
    Item item = new Item(name, stackable, amount, discription);
    return item;
}

然后我有另一个找到统计数据的函数

private Item findItemStats(string name)
{
    if (name == "Gold")
        return CreateItem(name, false, 0, "Gold Bar");

    return null;
}

这就是我用来添加项目的库存

  internal void addItem(string name)
    {
        var item = findItemStats(name);
        if (item == null)
            Debug.LogError("Item not found!");
        Instance.itemsToAdd.Add(item);
        if (!inventory())
            return;
        if (inventory().activeInHierarchy)
        {
            placeItemsOnInventory();
            sortItems();
        }

我的问题是,有什么更好的方法来存储和检索项目统计数据。我曾经在一个私有服务器上托管,并且项目统计数据存储在.txt(或json w / e)中,然后将有一个类用于获取该数据并将其放置到被调用的项目中。只是想要一种方法来做到这一点,或者一种方法将数据存储在一个单独的类/文件中,方便访问和放置项目数据。

2 个答案:

答案 0 :(得分:2)

这可能是一个相当广泛的主题,取决于您的需求。如果您只是在本地保存某些内容,最简单的选择是使用PlayerPrefs

PlayerPrefs示例:

PlayerPrefs.SetInt("Player Score", 10);
PlayerPrefs.Save();
//And to fetch:
var playerScore = PlayerPrefs.GetInt("Player Score");

More on using PlayerPrefs

序列化示例代码段。

对于更复杂的东西,您可以将数据序列化为数据格式,例如XML,JSON,二进制,CSV或您要导入的任何数据。这是二进制文件的示例。

public void SaveData()
{
    if (!Directory.Exists("Saves"))
        Directory.CreateDirectory("Saves");

    BinaryFormatter formatter = new BinaryFormatter();
    FileStream saveFile = File.Create("Saves/save.binary");
    LocalCopyOfData = PlayerState.Instance.localPlayerData;
    formatter.Serialize(saveFile, LocalCopyOfData);
    saveFile.Close();
}
public void LoadData()
{
    BinaryFormatter formatter = new BinaryFormatter();
    FileStream saveFile = File.Open("Saves/save.binary", FileMode.Open);
    LocalCopyOfData = (PlayerStatistics)formatter.Deserialize(saveFile);
    saveFile.Close();
}

More on Saving and Loading player data

SqlLite

或者,您可以使用工具将sqlite数据库集成到项目中。此代码看起来像.net。

中的标准数据库连接
string conn = "URI=file:" + Application.dataPath + "/PickAndPlaceDatabase.s3db"; //Path to database.
     IDbConnection dbconn;
     dbconn = (IDbConnection) new SqliteConnection(conn);
     dbconn.Open(); //Open connection to the database.
     IDbCommand dbcmd = dbconn.CreateCommand();
     string sqlQuery = "SELECT value,name, randomSequence " + "FROM PlaceSequence";
     dbcmd.CommandText = sqlQuery;
     IDataReader reader = dbcmd.ExecuteReader();

How to Setup Sqlite withn Unity3d

云托管

对于需要持久存储并在多台计算机上可用的数据。您可能需要考虑在适当的数据库或云托管数据存储服务上托管数据。一些例子:

  • Unity Cloud Data is in alpha(As of 7/10/2016)
  • Firebase(有趣的事实:Firebase最初被认为是mmo的聊天服务器工具)
  • Play Fab
  • Game Sparks
  • Amazon RDS
  • Google Cloud Datastore(MySql)
  • Google Cloud Database(NoSql)
  • Azure Db
  • back4app (thanks @Joe Blow)
  • Other Data Storage options

    谷歌搜索后端即服务也会产生许多其他好东西。天空是极限!〜

    答案 1 :(得分:0)

    Unity具有可用于存储数据的Scriptable对象,并且对象可以轻松存储在assets文件夹中。

    https://unity3d.com/learn/tutorials/modules/beginner/live-training-archive/scriptable-objects