The notes of the Russian translation are worked off. GMP001 names the component as the editor does, Rigid Body 2D. The editor guide points at Play > Never Show Play Changes, which is where the list is turned off. The AI preset of Debug Draw has a translated name. The Coroutines section of the language reference has its Waiting heading back before the yield table and says call into a script instead of callback. The catalog key of a method named like a field is api.<id>.method instead of carrying parentheses. The 21 easing presets say how each one moves and what it suits. Data types such as Audio Event get catalog entries for their names and fields, so the Inspector and the menus show them translated, and Audio Ranges has a translated name. The Russian table of agent commands in cli.ru.md is generated from the catalog like the English one, so a new or changed command shows up as a missing translation instead of a stale row.
23 KiB
id, group, group_title, title
| id | group | group_title | title |
|---|---|---|---|
| audio | audio | Звук | Звук |
Звук
Звук в Aego — это импортированные клипы. Их играют компоненты, скрипты и звуковые события, а микшируются они на шинах, громкость которых игрок задаёт в настройках. Звук относится к представлению: он никогда не меняет состояние игры, а перемотка и повтор проходят беззвучно.
Быстрый старт: перетащите .wav в проект, добавьте узлу «Источник звука 2D», задайте «Клип» и «Запуск при старте» и нажмите «Играть».
| Часть | Назначение |
|---|---|
| Клип | импортированный файл .wav, .ogg или .mp3 |
| «Источник звука 2D» | играет клип или звуковое событие из своего узла |
| «Слушатель звука 2D» | уши пространственного звука |
| «Звуковая зона 2D» | делает шину тише или громче, пока слушатель внутри |
| Звуковое событие | ассет данных: варианты, случайность, предел голосов и пространство |
| aego/audio | API для скриптов |
Звук работает во время игры и в aego run. В режиме редактирования «Инспектор» даёт прослушать клипы, а панель «Сцена» показывает дальность пространственных источников и зоны.
В «Попробовать» шар гудит, пока катится от стены к стене, и щёлкает, когда ударяется о неё. Слушатель находится на камере, поэтому гул смещается по панораме и затихает, когда шар движется. Отметьте Replay у скрипта, чтобы гул зазвучал снова. Браузер включает звук после первого щелчка по странице.
id: audio/clips title: Клипы
Клипы
.wav (8-, 16-, 24- и 32-битный PCM, 32-битный float) и .ogg Vorbis, моно или стерео, импортируются как есть. .mp3 при импорте переводится в .ogg с помощью ffmpeg. Если его нет в PATH, импорт завершается ошибкой AUD001 с командой, которой файл можно перевести вручную.
Настройки импорта в .meta:
| Настройка | По умолчанию | Значение |
|---|---|---|
stream |
auto |
auto потоково играет файлы длиннее 2 МБ или 10 секунд; on и off задают это принудительно |
loopStart, loopEnd |
-1 |
точки повтора в кадрах файла; первые значения берутся из блока smpl в wav |
gain |
1 |
громкость клипа до источника и шины |
bus |
sfx |
шина, если тот, кто играет клип, не выбрал её сам |
Клип без потоковой загрузки декодируется один раз, с частотой вывода, и общий для всех голосов, которые его играют. Потоковый клип декодируется во время воспроизведения из ассета в памяти; это выбор для музыки. Точки повтора за пределами звука дают AUD002, и тогда повторяется весь звук.
Панель «Ассеты» рисует форму волны каждого клипа.
Встроенные клипы
Вместе с движком поставляются четыре клипа, которым не нужны файлы: Beep, Click, Hum и Melody. Они есть в каждом списке выбора клипа в engine/audio, а скрипты получают их через audio.Builtin("Beep"). У Hum и Melody точки повтора охватывают весь клип, поэтому они повторяются без шва. Их играют сцены «Попробовать» на этих страницах.
id: audio/events title: Звуковые события
Звуковые события
Звуковое событие — это ассет данных типа Audio Event (Создать → Ассет данных → Audio Event). Оно называет один или несколько клипов и то, как их играть:
| Поле | Значение |
|---|---|
Variants |
клипы; при каждом воспроизведении один выбирается случайно |
Volume, Volume Random |
громкость и насколько тише может прозвучать каждое воспроизведение |
Pitch, Pitch Random |
высота тона и насколько вверх или вниз она может уйти при каждом воспроизведении, чтобы повторы не звучали одинаково |
Bus, Priority |
шина и то, какие голоса микшер вытесняет первыми, когда голосов не хватает |
Max Voices, Steal |
на пределе новое воспроизведение останавливает самый старый или самый тихий голос события либо пропускается |
Cooldown |
секунды игрового времени до следующего воспроизведения события |
Spatial … Pan Width |
см. Пространственный звук |
Loop, Pause With |
повтор до остановки; game ставится на паузу вместе с миром, never продолжает играть |
Скрипт играет событие через audio.PlayEvent(Jump) из @export var Jump AssetRef<AudioEvent>. «Источник звука 2D» играет событие, если задано его поле «Событие», и тогда настройки события заменяют поля воспроизведения источника. Пределы голосов и паузы между воспроизведениями считаются для каждого мира отдельно. Случайный выбор берётся из собственного зерна звукового сервиса, поэтому повтор выбирает те же варианты, а звук никогда не затрагивает случайные числа игры.
Как и любой ассет данных, событие может иметь базу и переопределять несколько полей. Событие без вариантов или пространственное событие, у которого Max Distance не больше Min Distance, — ошибка (AUD006).
id: audio/spatial title: Пространственный звук
Пространственный звук
Пространственный звук затихает и смещается по панораме в зависимости от расстояния до слушателя. Слушатель — первый включённый активный «Слушатель звука 2D» в иерархии; другой активный слушатель ниже в иерархии не учитывается (AUD005). Без слушателя слушает камера главного вывода, и AUD004 напоминает об этом на пространственных источниках; без камеры слушает начало координат.
Пространственный источник играет на полной громкости до «Мин. расстояния» и молчит начиная с «Макс. расстояния»; оба задаются в единицах мира. «Затухание» — кривая громкости между ними: время 0 — это «Мин. расстояние», время 1 — «Макс. расстояние». «Ширина панорамы», от 0 до 1, задаёт, насколько смещается по панораме звук, который находится сбоку на «Макс. расстоянии».
Все поля перечислены на странице «Источник звука 2D».
Кривая «Затухания» с ключами читается как громкость; пресет плавности читается как спад громкости; кривая по умолчанию падает до четверти на середине. Панорама — это расстояние вбок, делённое на «Макс. расстояние» и умноженное на «Ширину панорамы».
Звук, запущенный из узла, следует за ним; audio.PlayAt и audio.PlayEventAt остаются там, где начались. Позиции читаются после движения в кадре, поэтому звук следует за тем, что нарисовано.
В «Попробовать» слушатель находится на шаре, а камера следит за шаром. Ящик в середине гудит: он звучит громко и по центру, когда шар проходит мимо, и затихает в стороне, когда шар откатывается. Измените «Макс. расстояние» или «Ширину панорамы» ящика в «Инспекторе» и послушайте следующий проход.
id: audio/zones title: Зоны
Зоны
Пока слушатель находится внутри «Области» «Звуковой зоны 2D», «Шина» зоны за «Время перехода» приводится к её «Уровню». Область — прямоугольник в пространстве узла зоны.
- Среди пересекающихся зон на одной шине побеждает зона с наибольшим «Приоритетом», а при равенстве — та, в которую вошли позже. Выход из одной зоны оставляет другие на месте.
- Зоны действуют на слой мира в микшере, под настройками игрока и сеансом, и заканчиваются вместе с миром.
- Зона меняет всю шину, а не один источник: используйте её, чтобы приглушить музыку в помещении или сделать тише фоновые звуки рядом с меню.
В «Попробовать» шина музыки падает до пятой части, пока слушающий шар катится через фиолетовую область, и возвращается, когда он её покидает. Задайте «Уровень» 0, чтобы музыка внутри смолкла, или увеличьте «Время перехода» для более медленной смены.
id: audio/buses title: Шины и настройки
Шины и настройки
Каждый звук играет на шине: Music, Effects, Interface, Ambience или Voice, все под Master. Громкость шины — произведение трёх слоёв:
- настройки игрока,
audio.bus.<name>.volumeиmute, на странице «Звук» в Настройках; проект задаёт их значения по умолчанию вproject.aego; - сеанс:
audio.SetBusVolumeиaudio.Muteв скриптах и регуляторы «Аудиомикшера»; сеанс никогда не сохраняется; - мир: звуковые зоны.
Каждое изменение идёт плавно, поэтому ничего не щёлкает. audio.enabled выключает весь звук, не закрывая вывод; audio.bufferSize и audio.sampleRate открывают вывод заново, а играющие звуки продолжаются.
id: audio/music title: Музыка, пауза и перемотка
Музыка, пауза и перемотка
audio.Music(Theme, 1.5) повторяет клип на шине музыки и плавно переходит с музыки, которая играла до него; audio.StopMusic(1) плавно её убирает. Музыка продолжает играть, пока игра на паузе.
Пауза мира ставит на паузу звуки, у которых «Пауза вместе с» равно game, и не трогает звуки с never; PlayOptions.Unscaled делает то же для одного воспроизведения. Звук останавливается с коротким затуханием, когда узел, который его запустил, уничтожается.
Перемотка и повтор беззвучны: звуки, запущенные до перехода по таймлайну, сразу останавливаются, во время повтора записи ничего не играет, а после возврата в Live новые звуки снова играют. Звуки не входят в хеш состояния, поэтому игра воспроизводится одинаково со звуком и без него. Ждите игровую логику таймером, а не звуком.
id: audio/scripting title: Скрипты
Скрипты
import "aego/audio"
@export var Jump AssetRef<AudioEvent>
@export var Theme AssetRef<Clip>
func Ready() {
audio.Music(Theme, 1.5)
}
func OnJump() {
audio.PlayEvent(Jump)
}
| Функция | |
|---|---|
Play(clip) Sound, PlayWith(clip, options) Sound |
играет клип на его шине или с PlayOptions |
PlayAt(clip, position) Sound |
играет клип в точке мира, пространственно |
PlayEvent(event) Sound, PlayEventAt(event, position) Sound |
играет звуковое событие; пространственное событие следует за узлом скрипта |
Music(clip, seconds) Sound, StopMusic(seconds) |
повторяет музыку с плавным переходом, плавно убирает её |
BusVolume(bus) float, SetBusVolume(bus, volume), Mute(bus, on) |
громкость шины на сеанс поверх настроек игрока |
Pause(on) |
ставит на паузу или продолжает все звуки этого мира |
Builtin(name) AssetRef<Clip> |
встроенный клип: Beep, Click, Hum или Melody |
У PlayOptions есть Volume, Pitch, Pan, Bus, Loop, FadeIn, Priority и Unscaled; Volume и Pitch, равные 0, означают 1, а Bus Master играет на шине клипа. У Sound есть Done(), Playing(), Stop(), StopFade(seconds), Pause(), Resume(), SetVolume, SetPitch, SetPan, Position() и сигнал Completed(finished bool); yield ждёт его, а nil-звук считается завершённым. Каждое воспроизведение принадлежит узлу скрипта и останавливается, когда узел уничтожается.
Методы компонента: AudioSource2D.Play(), Stop(), StopFade(seconds) и IsPlaying(), а также сигналы Started и Finished(finished bool).
package demo
import (
"aego/audio"
"aego/log"
)
script Chime {
var hum audio.Sound
var frames int
func Ready() {
hum = audio.PlayWith(audio.Builtin("Hum"), audio.PlayOptions{Volume: 0.5, Pitch: 1.5, Loop: true})
hum.Completed.Connect(Ended)
log.Info("the hum plays: " + string(hum.Playing()))
}
func Ended(finished bool) {
log.Info("the hum ended, finished " + string(finished))
}
func Update(dt float) {
frames++
if frames == 60 {
hum.StopFade(0.2)
log.Info("fading at " + string(hum.Position()) + " s")
}
}
}
id: audio/editor title: Инструменты редактора
Инструменты редактора
Редактор микширует, прослушивает и рисует звук: микшер для шин, кнопки прослушивания на источниках и дальность пространственных звуков в панелях.
Аудиомикшер
Окно → Аудиомикшер или раскладка «Звук» показывает для каждой шины индикатор уровня, регулятор, кнопки mute и solo, а также играющие голоса и опустошения буфера. Регуляторы меняют текущий сеанс. Сбросить сеанс возвращает их назад; Сохранить в профиль записывает их в настройки игрока.
Инспектор
В режиме редактирования у «Источника звука 2D» есть Прослушать и Остановить для его клипа и полоса прогресса. Во время игры у него есть Воспроизвести и Остановить, и он показывает, сколько звука уже прошло.
Ручки и дальность
- Выберите пространственный источник, чтобы перетаскивать «Мин. расстояние» и «Макс. расстояние», или зону, чтобы перетаскивать её область. Каждое перетаскивание — один шаг отмены.
- Звук → Радиусы звука включает и выключает круги и зоны на панели «Сцена». Во время игры панель «Игра» также рисует слушателя, играющие пространственные голоса и линии к ним.
События, профилирование и проблемы
- «Монитор событий» показывает каждое воспроизведение и остановку строками
audio. В «Профилировщике» есть раздел «Звук»: вывод, голоса, время микширования и опустошения буфера. - «Проблемы» перечисляют источники без клипа и без события (AUD003), пространственные источники без слушателя (AUD004), лишних слушателей (AUD005), сломанные события (AUD006), нечитаемые файлы (AUD001) и точки повтора за пределами звука (AUD002).
id: audio/web title: Звук в вебе
Звук в вебе
Браузеры включают звук только после щелчка, нажатия клавиши или касания на странице; страница, открытая щелчком, например «Попробовать» на этом сайте, играет сразу. Веб-экспорт показывает в углу кнопку отключения звука. Она заглушает все шины на выходе, и браузер запоминает выбор до первого кадра следующего посещения. Если страница отдаётся с Cross-Origin-Opener-Policy: same-origin и Cross-Origin-Embedder-Policy: require-corp, задержка вывода на один блок меньше. Потоковые клипы читаются из скачанных данных, а не по сети.
id: audio/go title: Go
Go
snd := sdk.AudioOf(ctx)
beep, _ := sdk.BuiltinClip("Beep")
s := snd.PlayAt(beep.ID, pos, sdk.AudioOptions{Volume: 0.8}, node)
if snd.Done(s) { ... }
У Service есть Play, PlayAt, PlayEvent, PlayEventAt, Trigger и TriggerAt для значения события, построенного в Go, а также Music, StopMusic, Stop, Pause, SetVolume, SetPitch, SetPan, Done, Playing, Position и PauseAll. У каждого игрового мира свой сервис. Модуль, который находится через audio.ModuleOf(engine), владеет микшером, громкостями сеанса и кэшем клипов.
Система audio.ready (PreUpdate) запускает источники с «Запуском при старте» в первом кадре; audio.world (PostUpdate, работает и на паузе) двигает пространственные голоса, следует за слушателем и применяет зоны. Микшер работает в своём потоке и получает команды через кольцевой буфер, поэтому игровой поток никогда его не ждёт.

