A-Frame предоставляет гибкий механизм для создания компонентов через схемы (schema), которые описывают свойства компонента и их типы. Типы данных определяют, каким образом библиотека будет интерпретировать значения, передаваемые в HTML или через JavaScript.
Тип string используется для текстовых значений. Это
самый простой тип данных:
AFRAME.registerComponent('example-string', {
schema: {
text: { type: 'string', default: 'Привет, мир!' }
},
init: function () {
console.log(this.data.text);
}
});
Тип number предназначен для числовых значений, включая
целые и дробные числа.
AFRAME.registerComponent('example-number', {
schema: {
speed: { type: 'number', default: 1.0 }
},
tick: function (time, timeDelta) {
this.el.object3D.position.x += this.data.speed * timeDelta / 1000;
}
});
<a-entity example-number="speed: 2.5"></a-entity>.Тип boolean хранит значения true или
false.
AFRAME.registerComponent('example-boolean', {
schema: {
active: { type: 'boolean', default: true }
},
update: function () {
if (this.data.active) {
this.el.setAttribute('visible', true);
} else {
this.el.setAttribute('visible', false);
}
}
});
<a-entity example-boolean="active: false"></a-entity>.vec2 представляет двухмерный вектор {x, y}.
Используется для координат в 2D-пространстве, масштабирования и
смещений.
AFRAME.registerComponent('example-vec2', {
schema: {
offset: { type: 'vec2', default: { x: 0, y: 0 } }
},
init: function () {
console.log(this.data.offset.x, this.data.offset.y);
}
});
"1 2" или объект {x:1, y:2}.vec3 представляет трёхмерный вектор
{x, y, z} и является наиболее часто используемым типом в
A-Frame.
AFRAME.registerComponent('example-vec3', {
schema: {
position: { type: 'vec3', default: { x: 0, y: 1, z: 0 } }
},
init: function () {
this.el.object3D.position.set(
this.data.position.x,
this.data.position.y,
this.data.position.z
);
}
});
"0 1 0" или объект {x:0, y:1, z:0}.Тип color используется для задания цвета в формате
#RRGGBB, rgb() или стандартных названий
цветов.
AFRAME.registerComponent('example-color', {
schema: {
color: { type: 'color', default: '#FFF' }
},
update: function () {
this.el.setAttribute('material', 'color', this.data.color);
}
});
Тип selector позволяет ссылаться на другие элементы
сцены через CSS-селектор.
AFRAME.registerComponent('example-selector', {
schema: {
target: { type: 'selector' }
},
init: function () {
if (this.data.target) {
console.log('Найден объект:', this.data.target);
}
}
});
null, если объект не
найден.Расширение selector, которое возвращает массив
элементов, соответствующих селектору:
AFRAME.registerComponent('example-selector-all', {
schema: {
targets: { type: 'selectorAll' }
},
init: function () {
this.data.targets.forEach(el => el.setAttribute('visible', false));
}
});
array:number.AFRAME.registerComponent('example-array', {
schema: {
points: { type: 'array', default: [1, 2, 3] }
},
init: function () {
console.log(this.data.points);
}
});
"1, 2, 3".Типы, предназначенные для работы с внешними ресурсами:
AFRAME.registerComponent('example-asset', {
schema: {
model: { type: 'asset' }
},
init: function () {
console.log('Модель загружена:', this.data.model);
}
});
AFRAME.registerComponent('example-angle', {
schema: { rotationY: { type: 'angle', default: 0 } },
update: function () {
this.el.object3D.rotation.y = THREE.MathUtils.degToRad(this.data.rotationY);
}
});
Большинство типов автоматически преобразуют строки из HTML в объекты JavaScript. Например:
<a-entity example-vec3="position: 1 2 3"></a-entity>
будет автоматически преобразовано в {x:1, y:2, z:3}. Это
снижает необходимость ручной обработки данных и позволяет строить
декларативные компоненты с минимальным кодом.
update или init.AFRAME.utils.extend и позволяют реализовать сложные
структуры данных с собственной логикой преобразования.Типы данных в схеме — фундаментальный инструмент A-Frame, позволяющий создавать гибкие, читаемые и декларативные компоненты, которые легко интегрируются в HTML-сцену и управляются через JavaScript.