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.
4.8 KiB
id, title
| id | title |
|---|---|
| save | Сохранение игры |
Сохранение игры
Сохранение хранит то, что вы пометили как сохраняемое, а не всю сцену. Загрузка сохранения заново загружает его сцену из проекта и затем применяет сохранение поверх неё.
В «Попробовать» скрипт 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.
- Сцена сохранения загружается заново.
- Узлы сцены, которые сохранение помечает как уничтоженные, уничтожаются.
- Созданные объекты создаются снова со своими сохраняемыми id.
- Восстанавливаются трансформации, поля компонентов и поля
@persist. - Скрипты выполняют
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 выполняется, когда сохранение записано другой версией секции. Секции модулей, которые не загружены, сохраняются и записываются обратно без изменений.