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

C# 在字典或类似的东西中存储类信息,c#,unity3d,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 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();
        }

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

Unity具有可用于存储数据的脚本化对象,这些对象存储在资产文件夹中,因此易于访问


这是一个相当开放的话题,取决于您的需要。如果您只是在本地保存某些内容,最简单的选择是使用
PlayerPrefs

PlayerPrefs示例:

序列化示例代码段。 对于更复杂的内容,您可以将数据序列化为数据格式,如XML、JSON、binary、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();
}

SqlLite 或者,您可以使用工具将sqlite db集成到项目中。此代码看起来像.net中的标准db连接

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();

云主机 用于需要在多台计算机上持久化和可用的数据。您可能想考虑在适当的数据库或云托管数据存储服务上托管数据。一些例子:
  • (有趣的事实:Firebase最初被简化为mmo的聊天服务器工具)

  • 谷歌后端作为一项服务也会带来很多其他好处。天空是极限~

    我知道unity可以在预置中存储数据。在场景中创建项目时,统计信息将从存储位置传输到预设。我只需要一个在游戏开始前创建的物品数据列表,这样当我将物品添加到我的库存时,它有一个比我当前的findItemStats更干净的地方可以查看。因为只有100件物品后,这个会很难看。我会先把需要的信息存储在预制件上。但这使得预制件的装载量更大(可能不会太大,但仍然是mroe),如果数据直接存储在物品上,那么使用作弊引擎将物品添加到游戏中也更容易。此外,编辑项目统计信息更为复杂,因为wayScriptable对象不是预设的,它们是一个数据对象,如纹理或音频剪辑。“这对于仅用于存储数据的资产最有用。”这似乎像是在检索项目后保存数据。在你拿到物品之前,我需要一种存储数据的方法,这样游戏就有了一个干净且易于编辑的地方来寻找物品的初始状态(堆叠和数量可能会让我的代码使用混乱)啊,这些数据仍然非常有用,我会经常使用你的答案,但我不确定这是否解决了我最初的问题,即在获取项目之前存储数据的位置。您可以在init安装或unity事件的数据加载上运行任何提到的孤子。或者从xml\json\csv\text开始,然后加载它。哦,是的,这是一个很好的观点,我想我的想法不同啊,好吧,我想这就是我需要的!!非常感谢mandon别忘了即使parse.com关闭了,也有很多优秀的解析可能性,例如back4app(很高兴,它与parse几乎相同)
    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();