LeCodesdocs

Сценарные аспекты — готовые поведения

Пять аспектов, закрывающих базовые сценарии «пусть сцена ЧТО-ТО ДЕЛАЕТ» без написания кода: доехать до точки, пройти круг по вейпоинтам, вращаться, смотреть на цель, запустить GLB-анимацию. Они спроектированы для визуального редактора сцен (прикрепи из меню Aspects, привяжи цели выбором узлов во вьюпорте), но это обычные аспекты — node.aspect(MoveTo, { target }) из рукописного кода работает так же.

Всё движение выполняется покадрово в режиме Play. Пока сцена редактируется, аспекты инертны — но аспекты движения рисуют свои пути редакторными линиями (синие для движения, янтарные для look-at), так что маршрут можно видеть и настраивать, не запуская сцену.

Обычный рецепт сочетает их с узлами Empty (простые узлы-группы — см. scene-files.md): поставь Empty туда, куда что-то должно попасть, и наведи на него аспект. На узле-камере те же аспекты становятся движениями камеры.

MoveTo

Движение от стартовой позиции узла к узлу-цели.

Поле По умолчанию Описание
target null Узел назначения (ref('name') в файлах сцен)
duration 2 Секунды на весь путь
delay 0 Секунды ожидания перед стартом
mode 'once' 'once' остановиться там · 'loop' заново со стартовой точки · 'pingpong' туда-обратно
easing 'smooth' 'smooth' ease-in-out · 'linear' постоянная скорость

Цель отслеживается вживую — если она движется, путь изгибается к её новой позиции (а once держит узел прибитым к ней после прибытия).

TypeScript
crate: {
  mesh: { kind: 'box', size: [1, 1, 1] },
  position: [0, 0.5, 0],
  aspects: [use(MoveTo, { target: ref('dropPoint'), duration: 3, mode: 'pingpong' })],
},
dropPoint: { position: [4, 0.5, -2] },   // Empty

FollowPath

Движение по детям узла-пути, в порядке файла сцены — добавляй по Empty на вейпоинт.

Поле По умолчанию Описание
path null Узел, чьи дети — вейпоинты
duration 6 Секунды на один полный проход
delay 0 Секунды ожидания перед стартом
mode 'loop' 'loop' замкнутый круг (последний → первый) · 'once' остановиться на последней точке · 'pingpong' туда-обратно по разомкнутому пути
orient true Поворачиваться по направлению движения
forward '-z' Какая локальная ось ведёт при ориентации

Скорость постоянна вдоль всего пути (длины сегментов измеряются вживую, поэтому перетаскивание вейпоинта корректно перетаймит проход). GLB-модели обычно смотрят в +z — переверни forward, если твоя модель едет задом наперёд.

TypeScript
bus: {
  model: asset('./bus.glb'),
  aspects: [use(FollowPath, { path: ref('route'), duration: 12, forward: 'z' })],
},
route: {
  position: [0, 0, 0],
  children: {
    stop1: { position: [0, 0, 0] },
    stop2: { position: [8, 0, 2] },
    stop3: { position: [5, 0, 8] },
  },
},

Spin

Непрерывное вращение вокруг локальной оси — speed градусов в секунду, axis 'x' | 'y' | 'z' (по умолчанию 'y'). Компонуется в пространстве кватернионов, поэтому корректен на заранее повёрнутых узлах.

LookAt

Держит узел повёрнутым к узлу-цели каждый кадр.

Поле По умолчанию Описание
target null Узел, на который смотреть
forward '-z' Какая локальная ось указывает на цель
smoothing 0 0 — мгновенный снап; иначе секунды запаздывания поворота (больше = медленнее)

Турель, следящая за игроком, указатель или — на узле-камере — камера, которая держит движущегося героя в кадре, пока FollowPath ведёт кран.

PlayAnimation

Запускает GLB-клип при старте сцены. Прикрепляй к узлу с model:.

Поле По умолчанию Описание
clip '' Имя клипа; пустое = первый клип модели
loop true Зациклить клип
speed 1 Скорость воспроизведения

В редакторе его карточка инспектора показывает клипы модели в дропдауне и умеет Preview/Stop клипа вживую во время редактирования. Для управления в рантайме (переключение клипов из своего кода, перемотка, события) используй model.anim напрямую — этот аспект только нажимает play при загрузке.