c# - 将值存储到 android 设备

标签 c# android unity-game-engine

<分区>

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

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

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;
        }
    }
}

最佳答案

此处提供了类似的答案 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);

关于c# - 将值存储到 android 设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44852326/

相关文章:

c# - 如何停止 WPF 控件(使用扩展器)在 ItemsControl 中扩展到父级的高度

java - Android 插件无法与未找到类异常统一工作?

c# - Unity 修改值而不创建临时变量

windows - Unity Player 导致访问冲突 (0xc0000005)

c# - 设置 Backgroundworker MVVM,更新 Progressbar

c# - 非随机加权分布

c# - ASP.NET MVC 将 userID 放置在隐藏字段中

android - 第二个 Activity 处于 Activity 状态时android中第一个 Activity 的状态

java - PostValue 可以工作,但 SetValue 不能 MutableLiveData - AndroidX

android - 识别android应用程序何时在backGround中运行-按下Home按钮