Files
aego/modules/physics/res/docs/api.ru.md
sanspie f22242e5aa
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
Stage 11g2–11g3: registry texts, CLI and the site in Russian (D348)
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.
2026-10-25 15:31:22 +03:00

51 lines
2.4 KiB
Markdown

---
id: aego/physics
summary: Запросы лучом, отрезком и на пересечение к 2D-миру физики, поиск слоёв и гравитация мира.
---
Запросы работают, только пока идёт физика: во время игры и в `aego run`. Вне её каждая функция останавливает скрипт с `AES6010`. Функции `Overlap*` и `RaycastAll` заполняют переданный вами срез, не больше его длины, и возвращают, сколько элементов записали. `Layer` и `LayerMask` принимают слой, объявленный в **Настройках проекта → Физика**, и останавливают скрипт при неизвестном имени; маска `-1` означает все слои. В песочнице документации нет мира физики, поэтому пример выполняет все запросы в `OnCollisionEnter`. Этот метод вызывается, когда у узла есть «Тело 2D» и коллайдер и он касается другого тела. См. [Физика 2D](ref:physics).
## Пример
```aes run
package demo
import (
"aego/log"
"aego/physics"
)
script Grenade {
@export var Radius float = 2
var hits []NodeRef
var exploded bool
func Ready() {
for i := 0; i < 16; i++ {
hits = append(hits, nil)
}
log.Info("waiting for a collision; this node needs a Rigid Body 2D and a collider")
}
func OnCollisionEnter(other NodeRef, contact physics.Contact) {
if exploded {
return
}
exploded = true
log.Info("hit " + other.Name() + " with vertical speed " + string(contact.RelativeVelocity.Y))
n := physics.OverlapCircle(contact.Point, Radius, hits)
for i := 0; i < n; i++ {
wall := physics.Linecast(contact.Point, hits[i].WorldPosition(), -1)
if !wall.Hit {
log.Info("blast reaches " + hits[i].Name())
}
}
down := physics.Raycast(node.WorldPosition(), Vec2{0, 1}, 5)
if down.Hit {
log.Info("ground " + string(down.Distance) + " units below, gravity " + string(physics.Gravity().Y))
}
}
}
```