Спасательный цех государства

Я пытаюсь сделать простой магазин персонажей в своей игре. Я сделал 4 кнопки интерфейса, и каждая из них вызывает функцию BuySkin при нажатии. Это универсальный скрипт, который я нажимаю на каждую из этих кнопок, а затем просто настраиваю переменные, такие как цена. У меня проблема с сохранением состояния магазина. Первое, что пришло мне в голову, это. Но когда я покупаю одного персонажа, а затем перезагружаю игру, все персонажи разблокируются. Какие-либо предложения?

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

public class Button : MonoBehaviour {

public int price = 100;
public int bought = 1;

public AnimatorOverrideController overrideAnimator;

private PlayerController player;
private Text costText;

void Start ()
{
    player = GameObject.FindObjectOfType<PlayerController>();
    costText = GetComponentInChildren<Text>();
    costText.text = price.ToString();
    Load();

    if (bought == 2)
    {
        costText.enabled = false;
    }
    else
    {
        costText.enabled = true;
    }
}

public void BuySkin()
{
    if(CoinManager.coins >= price)
    {
        if(bought == 1)
        {
            player.GetComponent<Animator>().runtimeAnimatorController = overrideAnimator;
            bought = 2;
            CoinManager.coins -= price;
            costText.enabled = false;
            Save();
        }
    }
    if (bought == 2)
    {
        player.GetComponent<Animator>().runtimeAnimatorController = overrideAnimator;
    }
}

public void Save()
{
    BinaryFormatter bf = new BinaryFormatter();
    FileStream file = File.Create(Application.persistentDataPath + "/playerInfo.shopstates");
    ShopData data = new ShopData();
    data.bought = bought;

    bf.Serialize(file, data);
    file.Close();
}

public void Load()
{
    if (File.Exists(Application.persistentDataPath + "/playerInfo.shopstate"))
    {
        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Open(Application.persistentDataPath + "/playerInfo.shopstates", FileMode.Open);
        ShopData data = (ShopData)bf.Deserialize(file);
        file.Close();

        bought = data.bought;
    }
}
}

[Serializable]
class ShopData
{
    public int bought;
}

1 ответ

Определить проблему достаточно просто.

Когда вы нажимаете кнопку и затем сохраняете состояние, ваш "playerInfo.shopstate" будет содержать data.bought = 2, В следующий раз, когда вы загрузите игру, каждая кнопка будет вызывать Load() метод, и каждый будет читать тот же файл. Потому что файл имеет 2каждая кнопка получит bought = 2;

Учтите, что все ваши кнопки являются частью одного и того же магазина, но каждая из них имеет уникальное состояние в магазине. Есть несколько способов ее решения, например: ShopManager это сохраняет состояние каждой кнопки и отвечает за загрузку правильного значения для правой кнопки.

Другие вопросы по тегам