как заставить скриптовые объекты работать с постоянными данными в Unity - PullRequest
0 голосов
/ 28 января 2020

Моя цель - создать 50 объектов, которые имеют одинаковую структуру и используют постоянные данные.

Сначала я узнал о данных о персистентности, последовал официальному руководству Unity и заставил его работать. Поскольку учебное пособие работает с одним объектом, я начал создавать свою игру, такую ​​как:

Мои методы для сохранения и загрузки данных персистентности.

 public void saveBuy1()
    {


        Debug.Log("SavingBuy1");

        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Create(Application.persistentDataPath + "/buy1.dat");
        PlayerData data = new PlayerData();







        data.isBoxSold = 1;

        bf.Serialize(file, data);
        file.Close();
    }
public void loadBuy1()
    {
        Debug.Log("loading");



        if (File.Exists(Application.persistentDataPath + "/buy1.dat"))

        {
            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(Application.persistentDataPath + "/buy1.dat", FileMode.Open);
            PlayerData data = (PlayerData)bf.Deserialize(file);
            file.Close();


            GameObject.Find("buyBox1").GetComponentInChildren<Text>().text = "Item bought";
            isBoxsold1 = data.isBoxSold1;

        }
    }

Мой класс PlayerData:

[Serializable]
class PlayerData {

public int coinsAmount;
public int isBoxsold;

}

Создание поля

 //Regular box 1
    int isBoxSold = 0;
    int price1 = 6;
    public Text boxPrice1;
    public Image boxImage1;
    public Button buyButton1;

Но я быстро понял, что должен быть более эффективный способ создания мои объекты-ящики, чем делать это:

 //Regular box 1
    int isBoxSold1 = 0;
    int price1 = 6;
    public Text boxPrice1;
    public Image boxImage1;
    public Button buyButton1;

//Regular box 2
    int isBoxSold2 = 0;
    int price2 = 6;
    public Text boxPrice2;
    public Image boxImage2;
    public Button buyButton2;

, а затем создать дубликат метода loadBuy1 и вызвать его loadBuy2 et c ...

Итак, я обнаружил скриптовые объекты, которые, кажется, решить проблему необходимости создавать новые атрибуты и поля для каждого блока, но вместо этого создавать один класс один раз. Однако я не могу сказать asp, как можно связать эти экземпляры класса box, используя объекты сценариев с постоянством? Есть ли способ, где я мог бы создать один метод загрузки и сохранения, чтобы сохранить и загрузить все данные персистентности для всех объектов коробки одновременно? или мне все еще нужно создать метод сохранения и загрузки для каждого блока?

1 Ответ

0 голосов
/ 28 января 2020

Звучит так, как будто вы хотите сохранить данные для каждого блока в соответствующем ScriptableObject классе.

[CreateAssetMenu]
public class Box : ScriptableObject
{
    // Inspector
    [SerializeField] private int _isBoxSold = 0;
    [SerializeField] private int _price = 6;
    [SerializeField] private Text _boxPrice;
    [SerializeField] private Image _boxImage;
    [SerializeField] private Button _buyButton;

    // Public readonly properties
    public int IsBoxSold => _isBoxSold;
    public int Price => _price;
    public Text BoxPrice => _boxPrice;
}

, а затем сохранить их как список

[Serializable]
public class PlayerData 
{
    public int coinsAmount;

    [SerializeField] private List<Box> _boxes;

    // Example: run through all boxes and update their texts
    public void UpdateBoxes()
    {
        foreach(var box in _boxes)
        {
            box.BoxPrice.text = box.Price.ToString();
        }
    }
}

общее примечание:

Вы должны никогда использовать + "\" для системных путей! Вместо этого используйте Path.Combine, который автоматически использует правильные разделители пути в соответствии с целевой платформой, например,

var filepath = Path.Combine(Application.persistentDataPath, "buy1.dat");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...