将值存储到Android设备

时间:2017-06-30 17:51:25

标签: c# android unity3d

我正在为我的游戏创建库存系统,问题是我需要创建系统来将多个值存储到我的设备。

我知道有PlayerPrefs但是我只能存储2个值(让我们说一个键和第二个值),但我需要像table这样的东西。所以我必须在单行中存储这样的东西:

inventorySlot
itemID
amount

这是简单的3尺寸值,但我还需要存储4个,5个或更多。

那我怎么能实现这个目标呢?

这是当前代码,其中问题是存储到json不起作用。查看Debug.Log末尾的注释,看看它显示的内容。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class InventoryModel
{
    public List<InventoryItem> InventoryItems;

    public InventoryModel()
    {
        InventoryItems = new List<InventoryItem>();
    }
}

public class InventoryItem
{
    public int inventorySlot;
    public int itemID;
    public float amount;
}


public class Inventory : MonoBehaviour
{
    private int inventorySlots = 5;

    public Text itemSlot1;

    void Start ()
    {
        AddItemToInventory(1, 0, 2000);
        LoadInventory();
    }

    void Update ()
    {

    }

    public static void AddItemToInventory(int slot, int itemID, float amount)
    {
        InventoryModel im = new InventoryModel();
        InventoryItem ii = new InventoryItem();
        ii.inventorySlot = slot;
        ii.itemID = itemID;
        ii.amount = amount;

        im.InventoryItems.Add(ii);

        foreach(InventoryItem ia in im.InventoryItems)
        {
            Debug.Log(ia.itemID + "-" + ia.amount + "-" + ia.inventorySlot);    //Display 0-2000-1
        }
        string jsonString = JsonUtility.ToJson(im);
        Debug.Log(jsonString);                                                  //Display {}
        PlayerPrefs.SetString("PlayerInventory", jsonString);
    }

    private void LoadInventory()
    {
        foreach(InventoryItem ii in LoadInventoryFromPref().InventoryItems)
        {
            //Doesnt enter this loop
            Debug.Log(ii.inventorySlot);
            Debug.Log(ii.itemID);
            Debug.Log(ii.amount);
            Debug.Log("====");
        }
    }

    private static InventoryModel LoadInventoryFromPref()
    {
        string test = PlayerPrefs.GetString("PlayerInventory");
        Debug.Log(test);                                                        //display {}
        return JsonUtility.FromJson<InventoryModel>(test);
    }

    private static int GetMaxInventorySlots()
    {
        if(PlayerPrefs.HasKey("MIS"))
        {
            return PlayerPrefs.GetInt("MIS");
        }
        else
        {
            return 0;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

此处What is the best way to save game state?使用DataSaver.saveData提供了类似的答案。

使用PlayerPrefs存储JSON而非个别密钥。 只要数据大小小于1MB,PlayerPrefs就是最佳选择。

因为您希望存储的是一个数组:

inventorySlot
itemID
amount

您可以执行以下操作:

{
  "Items": [
    {
      "inventorySlot": 1,
      "itemID": "123ABC",
      "amount": 234
    },
    {
      "inventorySlot": 2,
      "itemID": "123ABC",
      "amount": "554"
    }
  ]
}

然后使用setString

将其分配到您选择的键中,然后将其存储在PlayerPref

然后,您可以使用Unity JsonUtility来序列化/反序列化JSON。

模型(注意:使用[System.Serializable]装饰模型:

[System.Serializable]
public class InventoryModel
{
    public List<Item> Items = new List<Item>();
}

[System.Serializable]
public class Item
{
    public int inventorySlot;
    public string itemID;
    public int amount;
}

以下是一个完整的例子:

    InventoryModel invModel = new InventoryModel();

    Item model = new Item();
    model.inventorySlot = 1;
    model.itemID = "123ABC";
    model.amount = 234;

    Item model2 = new Item();
    model2.inventorySlot = 2;
    model2.itemID = "123ABC";
    model2.amount = 554;

    invModel.Items.Add(model);
    invModel.Items.Add(model2);

    //Generate JSON then save it
    string yourModelJson = JsonUtility.ToJson(invModel);
    PlayerPrefs.SetString("InventoryKey", yourModelJson);

   //Read JSON back to Model
   InventoryModel testModel = new InventoryModel();
   string rawJsonFromPref = PlayerPrefs.GetString("InventoryKey");
   testModel = JsonUtility.FromJson<InventoryModel>(rawJsonFromPref);

答案 1 :(得分:0)

尝试使用sqlite,然后您不必担心存储的数据量。