Спасательный цех государства
Я пытаюсь сделать простой магазин персонажей в своей игре. Я сделал 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
это сохраняет состояние каждой кнопки и отвечает за загрузку правильного значения для правой кнопки.