Networked-Aframe (NAF) — это расширение для A-Frame, позволяющее создавать многопользовательские VR-сцены с синхронизацией состояния объектов в реальном времени. Библиотека строится поверх WebRTC и WebSockets, обеспечивая передачу данных между клиентами через серверную инфраструктуру. Основная цель NAF — управление состоянием сущностей (entities) и их компонентами, чтобы все участники видели одинаковую сцену.
Ключевые концепции:
networked.Для использования NAF необходимо подключить библиотеку в HTML:
<script src="https://unpkg.com/networked-aframe/dist/networked-aframe.min.js"></script>
После подключения создаётся сцена A-Frame с
компонентом networked-scene, который управляет
синхронизацией:
<a-scene networked-scene="
room: demo-room;
debug: true;
adapter: easyrtc;
">
</a-scene>
Параметры компонента:
easyrtc, socketio и другие).true по умолчанию).Любая сущность, которую необходимо синхронизировать, должна иметь
компонент networked. Простейший пример:
<a-box position="0 1 -3" color="red"
networked="template:#box-template; attachTemplateToLocal:true;">
</a-box>
<script id="box-template" type="text/html">
<a-entity>
<a-box color="red"></a-box>
</a-entity>
</script>
Ключевые параметры компонента networked:
true,
локальный клиент видит объект сразу.client или server).Синхронизация может включать компоненты position, rotation, scale, а также пользовательские компоненты.
Для создания многопользовательских аватаров используется шаблон
networked-avatar. Пример:
<a-entity id="player" networked-avatar="template:#avatar-template"></a-entity>
<script id="avatar-template" type="text/html">
<a-entity>
<a-box color="blue" scale="0.3 1.6 0.3"></a-box>
</a-entity>
</script>
Особенности работы:
NAF предоставляет событийную систему для реакции на подключение, отключение и обновление сущностей:
networked-entity-created — вызывается
при появлении новой сетевой сущности.networked-entity-destroyed — при
удалении сущности.networked-data-changed — при изменении
состояния компонента.Пример обработки события:
AFRAME.scenes[0].addEventListener('networked-entity-created', function(evt) {
console.log('Создана новая сущность:', evt.detail.el);
});
События позволяют динамически добавлять функциональность к объектам или управлять игровыми процессами.
Networked-Aframe позволяет подключать кастомные сценарии и компоненты:
AFRAME.registerComponent('sync-color', {
schema: {color: {type: 'color', default: 'white'}},
init: function() {
this.el.addEventListener('networked-data-changed', evt => {
this.el.setAttribute('material', 'color', evt.detail.data.color);
});
}
});
Эта техника применяется для реализации интерактивных объектов, которые должны изменяться одновременно для всех участников сцены.
NAF работает с различными серверными адаптерами:
Простейший пример сервера на Node.js + socket.io:
const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
io.on('connection', socket => {
console.log('Клиент подключен:', socket.id);
socket.on('naf-message', data => {
socket.broadcast.emit('naf-message', data);
});
});
server.listen(3000);
Такой сервер обеспечивает маршрутизацию сообщений между клиентами для синхронизации состояния VR-сцены.
Networked-Aframe позволяет строить полноценные многопользовательские VR-приложения, обеспечивая синхронизацию объектов, аватаров и пользовательских действий. Гибкая архитектура компонентов и событийная система делают библиотеку универсальным инструментом для создания сетевых VR-сцен на базе A-Frame.