我正在为我的游戏创建库存系统,问题是我需要创建系统来将多个值存储到我的设备。
我知道有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;
}
}
}
答案 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,然后您不必担心存储的数据量。