As65
(Алексей)
19.Май.2021 14:27:28
#1
public double BuyForCoins;
public TMP_Text BuyForCoinstext;
public MasterSc coin;
public ZoomPan ZoomPan;
public GameObject PanelBuy;
public GameObject CloseZavod;
public static DataBasePanel dataBasePanel;
[SerializeField]
private string dataName;
public void Start()
{
if (string.IsNullOrEmpty(dataName)) dataName = gameObject.name;
if (dataBasePanel == null) dataBasePanel = DataBasePanel.Load();
Save();
}
public void Update()
{
BuyForCoinstext.text = "" + BuyForCoins.ToString("F0");
}
public void Buy()
{
if (coin.Coin >= BuyForCoins)
{
coin.Coin -= BuyForCoins;
PanelBuy.SetActive(false);
Destroy(PanelBuy);
Destroy(CloseZavod);
ZoomPan.enabled = true;
}
Save();
}
private void Save()
{
DataBasePanel.Save(dataBasePanel);
}
}
[System.Serializable]
public class DataBasePanel
{
public static void Save(DataBasePanel data)
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
FileStream stream = new FileStream(Application.persistentDataPath + "/Panelbuy.bin", FileMode.Create);
binaryFormatter.Serialize(stream, data);
stream.Dispose();
stream.Close();
}
public static DataBasePanel Load()
{
if (File.Exists(Application.persistentDataPath + "/Panelbuy.bin"))
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
FileStream stream = new FileStream(Application.persistentDataPath + "/Panelbuy.bin", FileMode.OpenOrCreate);
DataBasePanel database = binaryFormatter.Deserialize(stream) as DataBasePanel;
stream.Dispose();
stream.Close();
return database;
}
else
{
return new DataBasePanel();
}
}
}
AlexP
(Alex P.)
19.Май.2021 14:43:02
#2
Так а не работает как именно, выдает какие-то ошибки или что?
При выкладывании кода надо нажимать кнопку Код .
As65
(Алексей)
19.Май.2021 15:21:50
#3
Ошибки не выдает, просто не сохраняет
AlexP
(Alex P.)
19.Май.2021 15:31:39
#4
Может сохраняет, но не загружает?)
Panelbuy.bin
создается?
As65
(Алексей)
19.Май.2021 15:48:29
#5
Кстати, про это забыл, да, создается. Как сделать загрузку теперь?)
AlexP
(Alex P.)
19.Май.2021 15:58:09
#6
Определить вызывается ли это
и сама загрузка внутри Load
, с помощью отладчика или отладочного вывода.
Unity - Scripting API: Debug.Log
http://blog.algoprog.ru/how-to-debug-small-programs/
As65
(Алексей)
19.Май.2021 16:27:59
#7
проверил, все работает, мне кажется все-таки проблема в переменных GameObject’ах
AlexP
(Alex P.)
19.Май.2021 16:36:16
#8
А сохраняется-то что? В классе DataBasePanel
тут нет никаких свойств.
As65
(Алексей)
19.Май.2021 16:37:58
#9
As65:
public void Buy()
По сути, ну как я думал все что происходит тут
AlexP
(Alex P.)
19.Май.2021 16:46:48
#10
BinaryFormatter
сохраняет тот объект, что ему передан.
As65
(Алексей)
19.Май.2021 16:48:31
#11
Не подскажешь, как именно эти переменные передать в виде кода?)
AlexP
(Alex P.)
19.Май.2021 16:54:00
#12
Хранить данные для сохранения в отдельном объекте, передавать его BinaryFormatter
.
Как тут Using BinaryFormatter in Unity to Save and Load Game Data – Digital Ephemera
As65
(Алексей)
22.Май.2021 21:46:38
#13
Еще такой вопрос, я понял как сохраняют GameObject, через Position обычно, но если есть функция Destroy(GameObject), и мне нужно сохранить именно уничтожение объекта, то есть ли смысл сохранять объект через его позицию?
AlexP
(Alex P.)
22.Май.2021 22:47:18
#14
Сохраняют то, что надо сохранить.
Тут , например, позиция, поворот, патроны, состояние и т.д. (состояние воина — стоит/идет/атакует/умер/… ).
Так с уничтоженным объектом же нельзя работать ) Юнити ошибку выдаст если попытаться обратиться к свойствам уничтоженного объекта.
Ну точнее оно не совсем сразу уничтожает, но все равно уничтожение нужно только для случаев когда объект больше не нужен в программе.
Так что можно например
Не уничтожать, а просто помечать как уничтоженный с помощью какого-нибудь своего отдельного свойства. Заодно можно сделать отображение уничтоженных/убитых объектов в игре.
или
Создавать только сохраненные объекты при загрузке сохранения (ну или уничтожать все остальные).
As65
(Алексей)
23.Май.2021 10:48:09
#15
То есть можно перевести в объект в bool и сохранять уже эту переменную?
AlexP
(Alex P.)
23.Май.2021 10:53:59
#16
Да, но смотря как сделано сохранение/загрузка.
Если хранить всё сохраняемое в отдельных своих классах (как в туториале выше ), то должно быть не сложно. Сделать в классе два свойства (позиция и уничтожен ли), и при загрузке проверять.
As65
(Алексей)
23.Май.2021 11:13:24
#17
Как я понял, мне позиция не нужна
Могу ли я создать переменную bool и в старте написать bool = true;
а в public void Buy
if(Destroy(GameObject)){bool = false};
И сохранять именно значение bool?
Что именно вы пытаетесь сохранить-то?
As65
(Алексей)
23.Май.2021 11:27:12
#19
У меня уничтожаются объекты при нажатии кнопки, при новом запуске они остаются, мне же нужно чтобы их не было