AFRAME.registerSystem является фундаментальным
инструментом архитектуры A-Frame для организации логики сцены на уровне
системы. Системы предназначены для управления глобальными состояниями и
функционалом, которые должны быть доступны нескольким сущностям
одновременно. В отличие от компонентов, которые привязываются к
конкретным элементам сцены, системы работают на уровне всей сцены и
обеспечивают централизованное управление.
Основные цели систем:
Система создаётся с помощью регистрации через
AFRAME.registerSystem(name, definition), где
name — уникальный идентификатор, а definition
— объект, описывающий методы и свойства системы.
Объект определения системы может содержать следующие ключевые элементы:
init() — вызывается один раз при
инициализации сцены. Здесь выполняется настройка внутренних свойств,
подписка на события сцены, создание необходимых структур данных.update(oldData) — вызывается при
изменении данных системы, если она имеет конфигурируемые свойства. В
большинстве случаев используется реже, чем в компонентах.tick(time, timeDelta) — метод для
обновления состояния каждый кадр. Он аналогичен tick в
компонентах, но применяется ко всей сцене.remove() — вызывается при удалении
системы или сцены. Позволяет освобождать ресурсы и отключать обработчики
событий.Пример минимальной системы:
AFRAME.registerSystem('game-manager', {
schema: { level: { type: 'int', default: 1 } },
init: function () {
this.players = [];
console.log('Game system initialized');
},
tick: function (time, timeDelta) {
this.players.forEach(player => {
player.updatePosition(timeDelta);
});
},
addPlayer: function (player) {
this.players.push(player);
}
});
В этом примере система game-manager хранит список
игроков и обновляет их позиции каждый кадр, предоставляя
централизованное управление.
| Особенность | Система | Компонент |
|---|---|---|
| Привязка | Сцена целиком | Конкретный элемент () |
| Цель | Глобальная логика | Локальное поведение сущности |
| Методы жизненного цикла | init, tick, remove,
update |
init, update, tick,
remove |
| Доступ к данным | Общедоступен для всех компонентов | Локальные свойства компонента |
| Использование | Сбор и управление глобальным состоянием, кэширование ресурсов | Реализация поведения, визуальных эффектов, интерактивности |
Компоненты часто зависят от систем для доступа к глобальной информации. Например, несколько компонентов могут обращаться к системе физики, чтобы получать вычисленные силы и коллизии, вместо того чтобы дублировать вычисления локально.
Компонент может ссылаться на систему через метод
this.el.sceneEl.systems[name]:
AFRAME.registerComponent('player-controller', {
init: function () {
this.gameSystem = this.el.sceneEl.systems['game-manager'];
this.gameSystem.addPlayer(this);
},
updatePosition: function(delta) {
// Локальные вычисления позиции
}
});
Такой подход позволяет компонентам оставаться легкими и сосредоточенными на локальных задачах, делегируя глобальную логику системе.
Системы способствуют оптимизации за счёт:
Использование систем особенно важно в больших VR-сценах, где множество сущностей должны взаимодействовать между собой, но прямое управление каждой из них компонентами создаёт нагрузку на рендеринг и JS-цикл.
Системы позволяют создавать модульную архитектуру, где глобальные функции отделены от локальных компонентов, упрощая масштабирование и поддержку проекта.