Godot 4 · GDScript
Облачные сохранения
Облачные сохранения позволяют игроку сохранять прогресс между устройствами. Каждое сохранение хранится в нумерованном слоте (1-10) и представляет собой объект данных произвольной формы, проверяемый по схеме, которую вы определяете в панели.
Настройка панели
В панели включите облачное сохранение и определите схему сохранения: поля, которые может содержать ваш объект сохранения, и их типы. Количество слотов и лимит размера зависят от вашего тарифа.
Сохранения проверяются по этой схеме на сервере: поле, отсутствующее в схеме, или неверный тип отклоняются.
Сохранение в слот
Запишите (или перезапишите) слот вашими данными сохранения. Слушайте save_completed.
Gamdato.save_completed.connect(_on_saved)
Gamdato.save_game(1, {"level": 5, "coins": 120, "unlocked": ["sword"]})
func _on_saved(ok: bool, slot: int, meta: Dictionary, error_code: String) -> void:
if ok: print("Saved slot %d (%d bytes)" % [slot, meta.size_bytes])
else: print("Save failed: %s" % error_code)error_code может быть plan (облачные сохранения не входят в ваш тариф), too_large, storage_full или validation (данные не соответствуют схеме).
Загрузка слота
Прочитайте слот обратно. Пустой слот, это не ошибка: found просто равно false.
Gamdato.save_loaded.connect(_on_loaded)
Gamdato.load_game(1)
func _on_loaded(slot: int, found: bool, data: Dictionary, error_code: String) -> void:
if found:
_apply_save(data)
else:
_new_game()# save_loaded(slot: int, found: bool, data: Dictionary, error_code: String)
# found = false for an empty slot (not an error)
# data = the Dictionary you saved, verbatim:
{ "level": 5, "coins": 120 }Список слотов
Список того, какие слоты используются, с их размером и временем последнего обновления (без данных). Полезно для меню слотов сохранения. Приходит через saves_listed.
Gamdato.saves_listed.connect(_on_saves)
Gamdato.list_saves()
func _on_saves(saves: Array) -> void:
for s in saves:
print("Slot %d - updated %s" % [s.slot, s.updated_at])# saves: Array, each used slot (metadata only, no data):
{
"slot": int,
"size_bytes": int,
"updated_at": String
}
# save_completed -> meta has the same shape (slot, size_bytes, updated_at).Удаление слота
Удалите слот. Удаление пустого слота безвредно (всё равно сообщает об успехе).
Gamdato.save_deleted.connect(_on_deleted)
Gamdato.delete_save(1)
func _on_deleted(ok: bool, slot: int, error_code: String) -> void:
if ok: print("Slot %d cleared" % slot)