ci / release (push) Successful in 5m5s
ci-platforms / build (amd64, windows, windows-2022) (push) Skipped
ci-platforms / build (arm64, darwin, macos-15) (push) Skipped
ci-platforms / build (amd64, darwin, macos-15-intel) (push) Skipped
ci / checks (push) Successful in 4m41s
ci / build (amd64, linux, ubuntu-24.04) (push) Successful in 7m14s
The remaining editor strings and undo step names; component, field, enum, setting, diagnostic and Script API texts under schema.*, enum.*, setting.*, diag.* and api.*; the launcher, the in-game Settings View with a Language setting, the CLI and aego schema show --lang. Every documentation page has a .ru.md translation; the site has a full Russian tree with hreflang, a language switch and ru/llms.txt; aego docs check --lang ru. New doc.tutorial and doc.recipe icons. Fix: an animator restored by a rewind prepares its controller before the replayed step.
71 lines
4.8 KiB
Markdown
71 lines
4.8 KiB
Markdown
---
|
||
id: save
|
||
title: Сохранение игры
|
||
---
|
||
# Сохранение игры
|
||
|
||
Сохранение хранит то, что вы пометили как сохраняемое, а не всю сцену. Загрузка сохранения заново загружает его сцену из проекта и затем применяет сохранение поверх неё.
|
||
|
||
В «Попробовать» скрипт Checkpoint сохраняет игру через секунду, а затем каждые несколько секунд загружает это сохранение. У зелёного шара есть компонент «Сохранение», и он возвращается туда, где был сохранён; у серого его нет, и он начинает заново из файла сцены. В «Попробовать» сохранения хранятся в памяти и пропадают, когда страница закрывается.
|
||
|
||
| Пометка | Что сохраняется |
|
||
|---|---|
|
||
| компонент `save.Persist` | трансформация узла и флаг включения |
|
||
| `sdk.Persist("field", …)` для типа компонента | эти поля каждого такого компонента |
|
||
| `@persist` у поля скрипта | это поле каждого экземпляра скрипта |
|
||
| `OnSave()` / `OnLoad()` | значения, которые скрипт записывает через `save.Put*` |
|
||
|
||
Кроме того, сохранение помнит, какие узлы сцены были уничтожены, и каждый объект, созданный через `scene.Spawn`: его префаб, родителя, позу и сохраняемые данные.
|
||
|
||
@persist
|
||
var Coins int
|
||
|
||
func OnSave() {
|
||
save.PutVec2("checkpoint", lastCheckpoint)
|
||
}
|
||
|
||
func OnLoad() {
|
||
lastCheckpoint = save.GetVec2("checkpoint", node.Position())
|
||
}
|
||
|
||
| Функция | |
|
||
|---|---|
|
||
| `save.Save(slot)` | записывает игру в слот в конце кадра |
|
||
| `save.Load(slot)` | заново загружает сохранённую сцену и восстанавливает слот |
|
||
| `save.Checkpoint()` | сохраняет в слот `checkpoint` |
|
||
| `save.Autosave(seconds)` | сохраняет в `autosave` каждые заданные реальные секунды |
|
||
| `save.Exists(slot)`, `save.Delete(slot)` | |
|
||
| `save.SetGlobalInt(key, v)`, `save.GlobalInt(key, def)` | прогресс на всю игру, который несёт каждое сохранение; есть также Float, Bool, String |
|
||
|
||
В именах слотов допустимы буквы, цифры, `-` и `_`. Сохранения лежат рядом с настройками игрока, в `saves/` профиля.
|
||
|
||
---
|
||
id: save/load
|
||
title: Порядок загрузки
|
||
---
|
||
# Порядок загрузки
|
||
|
||
Загрузка сохранения пересобирает игру в фиксированном порядке. Зная порядок, вы знаете, какие значения у скрипта уже есть в `Ready` и `OnLoad`.
|
||
|
||
1. Сцена сохранения загружается заново.
|
||
2. Узлы сцены, которые сохранение помечает как уничтоженные, уничтожаются.
|
||
3. Созданные объекты создаются снова со своими сохраняемыми id.
|
||
4. Восстанавливаются трансформации, поля компонентов и поля `@persist`.
|
||
5. Скрипты выполняют `Ready`, затем `OnLoad`.
|
||
|
||
Поля, восстановленные на шаге 4, уже заданы, когда выполняется `Ready`. Непомеченное поле берётся из сцены, как при новом запуске.
|
||
|
||
Ссылки между сохранёнными узлами сохраняются: `NodeRef` на узел сцены сохраняется по его id, а ссылка внутрь созданного объекта — по сохраняемому id объекта и пути внутри него.
|
||
|
||
---
|
||
id: save/go
|
||
title: Модули
|
||
---
|
||
# Модули
|
||
|
||
Модуль сохраняет своё состояние в секции:
|
||
|
||
r.SaveSection("mygame.quests", questSection{})
|
||
|
||
У секции есть `Version`, `Save(world, w)`, `Load(world, r)` и `Migrate(node, from, to)`. `Migrate` выполняется, когда сохранение записано другой версией секции. Секции модулей, которые не загружены, сохраняются и записываются обратно без изменений.
|