aframe
Компоненты
Поиск…
Вступление
В шаблоне entity-component-system компонент является многократно используемым модульным блоком данных, который мы подключаем к сущности для добавления внешнего вида, поведения и / или функциональности.
В A-Frame компоненты изменяют объекты, которые являются 3D-объектами в сцене. Мы смешиваем и компонуем компоненты вместе для создания сложных объектов. Они позволяют нам инкапсулировать three.js и JavaScript-код в модули, которые мы можем декларативно использовать из HTML. Компоненты примерно аналогичны CSS.
замечания
Методы обработки Lifecycle Definition
Поскольку схема является анатомией, методы жизненного цикла - это физиология; схема определяет форму данных, методы обработчика жизненного цикла используют данные для модификации объекта. Обработчики обычно взаимодействуют с API-интерфейсом Entity .
Обзор методов
метод | Описание |
---|---|
в этом | Вызывается один раз, когда компонент инициализируется. Используется для настройки начального состояния и создания экземпляров переменных. |
Обновить | Вызывается как при инициализации компонента, так и при обновлении любого из свойств компонента (например, через setAttribute ). Используется для изменения объекта. |
Удалить | Вызывается, когда компонент удаляется из объекта (например, через removeAttribute ) или когда объект отсоединяется от сцены. Используется для отмены всех предыдущих изменений объекта. |
поставить галочку | Вызывается каждый цикл визуализации или галочка сцены. Используется для непрерывных изменений или проверок. |
играть | Вызывается всякий раз, когда сцена или сущность играет, чтобы добавить какой-либо фон или динамическое поведение. Также вызывается один раз, когда компонент инициализируется. Используется для запуска или возобновления поведения. |
Пауза | Вызывается всякий раз, когда сцена или объект приостанавливаются, чтобы удалить фон или динамическое поведение. Также вызывается, когда компонент удаляется из объекта или когда объект отсоединяется от сцены. Используется для приостановки поведения. |
updateSchema | Вызывается каждый раз, когда обновляется какое-либо свойство компонента. Может использоваться для динамического изменения схемы. |
Свойства прототипа компонента
В рамках методов мы имеем доступ к прототипу компонента через this
:
Имущество | Описание |
---|---|
this.data | Разработанные свойства компонентов вычисляются из значений по умолчанию схемы, mixins и атрибутов сущности. |
this.el | Ссылка на [entity] [entity] как элемент HTML. |
this.el.sceneEl | Ссылка на [scene] [scene] как HTML-элемент. |
this.id | Если компонент может иметь [несколько экземпляров] [несколько], идентификатор отдельного экземпляра компонента (например, foo от sound__foo ). |
МЕТОДЫ
.в этом ()
.init ()
вызывается один раз в начале жизненного цикла компонента. Сущность может вызывать обработчик init
компонента:
- Когда компонент статически задается в объекте в файле HTML, и страница загружается.
- Когда компонент установлен на прикрепленном объекте через
setAttribute
. - Когда компонент установлен на непривязанный объект, и объект затем присоединяется к сцене через
appendChild
.
Обработчик init
часто используется для:
- Настроить начальное состояние и переменные
- Методы связывания
- Приложить прослушиватели событий
Например, init
компонента курсора будет устанавливать переменные состояния, методы привязки и добавлять прослушиватели событий:
AFRAME.registerComponent('cursor', {
// ...
init: function () {
// Set up initial state and variables.
this.intersection = null;
// Bind methods.
this.onIntersection = AFRAME.utils.bind(this.onIntersection, this);
// Attach event listener.
this.el.addEventListener('raycaster-intersection', this.onIntersection);
}
// ...
});
.update (oldData)
.update (oldData)
вызывается всякий раз, когда свойства компонента изменяются, в том числе в начале жизненного цикла компонента. Сущность может вызывать обработчик update
компонента:
- После
init ()
в начале жизненного цикла компонента. - Когда свойства компонента обновляются с помощью
.setAttribute
.
Обработчик update
часто используется для:
-
this.data
большую часть работы по внесению изменений в объект, используяthis.data
. - Измените объект при изменении одного или нескольких свойств компонента.
Гранулярные модификации объекта могут выполняться с помощью [diffing] [diff] текущего набора данных ( this.data
) с предыдущим набором данных перед обновлением ( oldData
).
A-Frame вызывает .update()
как в начале жизненного цикла компонента, так и при каждом изменении данных компонента (например, в результате setAttribute
). Обработчик обновления часто использует this.data
для изменения объекта. Обработчик обновления имеет доступ к предыдущему состоянию данных компонента через свой первый аргумент. Мы можем использовать предыдущие данные компонента, чтобы точно указать, какие свойства были изменены для выполнения подробных обновлений.
Например, update
видимого компонента устанавливает видимость объекта.
AFRAME.registerComponent('visible', {
/**
* this.el is the entity element.
* this.el.object3D is the three.js object of the entity.
* this.data is the component's property or properties.
*/
update: function (oldData) {
this.el.object3D.visible = this.data;
}
// ...
});
.Удалить ()
.remove ()
вызывается всякий раз, когда компонент отсоединяется от объекта. Сущность может вызывать обработчик remove
компонента:
- Когда компонент удаляется из объекта через
removeAttribute
. - Когда объект отсоединяется от сцены (например,
removeChild
).
Обработчик remove
часто используется для:
- Удалите, отмените или очистите все модификации компонента до объекта.
- Отсоедините прослушиватели событий.
Например, когда [светлый компонент] [свет] удален, световой компонент удалит светлый объект, который он ранее установил на объекте, тем самым удалив его из сцены.
AFRAME.registerComponent('light', {
// ...
remove: function () {
this.el.removeObject3D('light');
}
// ...
});
.tick (время, времяDelta)
.tick ()
вызывается на каждом тике или кадре цикла рендеринга сцены. Сцена вызовет обработчик tick
компонента:
- На каждом кадре цикла визуализации.
- Порядка 60-120 раз в секунду.
- Если объект или сцена не приостановлены (например, инспектор открыт).
- Если объект все еще привязан к сцене.
tick
обработчик часто используется для:
- Непрерывно модифицируйте объект на каждом кадре или на интервале.
- Опрос по условиям.
Обработчик tick
обеспечивает глобальное время безотказной работы сцены в миллисекундах ( time
) и разницу во времени в миллисекундах с момента последнего кадра ( timeDelta
). Они могут использоваться для интерполяции или только для запуска частей обработчика tick
с заданным интервалом.
Например, компонент отслеживаемых элементов управления будет обрабатывать анимацию контроллера, обновлять положение и вращение контроллера и проверять нажатия кнопок.
AFRAME.registerComponent('tracked-controls', {
// ...
tick: function (time, timeDelta) {
this.updateMeshAnimation();
this.updatePose();
this.updateButtons();
}
// ...
});
.Пауза ()
.pause ()
вызывается, когда объект или сцена останавливаются. Объект может вызывать обработчик pause
компонента:
- Перед удалением компонента перед
remove
обработчикаremove
. - Когда объект приостановлен с
Entity.pause ()
. - Когда сцена приостановлена с помощью
Scene.pause ()
(например, инспектор открыт).
Обработчик pause
часто используется для:
- Удалить прослушиватели событий.
- Удалите все шансы на динамическое поведение.
Например, звуковой компонент приостанавливает звук и удаляет прослушиватель событий, который бы воспроизводил звук в событии:
AFRAME.registerComponent('sound', {
// ...
pause: function () {
this.pauseSound();
this.removeEventListener();
}
// ...
});
.играть ()
.play ()
вызывается, когда объект или сцена возобновляются. Объект может вызывать обработчик play
компонента:
- Когда компонент сначала подключен, после
update
обработчикаupdate
. - Когда объект был приостановлен, но затем возобновлен с
Entity.play ()
. - Когда сцена была приостановлена, но затем возобновлена с помощью
Scene.play ()
.
Обработчик play
часто используется для:
- Добавить прослушиватели событий.
Например, компонент звука будет воспроизводить звук и обновлять прослушиватель событий, который будет воспроизводить звук в событии:
AFRAME.registerComponent('sound', {
// ...
play: function () {
if (this.data.autoplay) { this.playSound(); }
this.updateEventListener();
}
// ...
});
.updateSchema (данные)
.updateSchema ()
, если определено, вызывается для каждого обновления, чтобы проверить, требуется ли динамическое изменение схемы.
Обработчик updateSchema
часто используется для:
- Динамически обновлять или расширять схему, обычно в зависимости от значения свойства.
Например, компонент геометрии проверяет, изменилось ли свойство primitive
чтобы определить, следует ли обновлять схему для другого типа геометрии:
AFRAME.registerComponent('geometry', {
// ...
updateSchema: (newData) {
if (newData.primitive !== this.data.primitive) {
this.extendSchema(GEOMETRIES[newData.primitive].schema);
}
}
// ...
});
КОМПОНЕНТНЫЕ ПРОТОТИПНЫЕ МЕТОДЫ
.flushToDOM ()
Чтобы сэкономить время процессора на строковом уровне, A-Frame будет обновлять только в режиме отладки сериализованное представление компонента в фактической DOM. Вызов flushToDOM () будет вручную сериализовать данные компонента и обновить DOM:
document.querySelector('[geometry]').components.geometry.flushToDOM();
Зарегистрируйте пользовательский компонент A-Frame
AFRAME.registerComponent (имя, определение)
Зарегистрируйте компонент A-Frame. Мы должны регистрировать компоненты, прежде чем использовать их в любом месте , Значение из файла HTML, компоненты должны быть в порядке до ,
- {string} name - Имя компонента. Открытый API компонента, представленный через имя атрибута HTML.
- Определение {Object} - определение компонента. Содержит методы обработчика схемы и жизненного цикла.
Регистрация компонента в foo в файле js, например foo-component.js
AFRAME.registerComponent('foo', {
schema: {},
init: function () {},
update: function () {},
tick: function () {},
remove: function () {},
pause: function () {},
play: function () {}
});
Использование компонента foo в вашей сцене
<html>
<head>
<script src="aframe.min.js"></script>
<script src="foo-component.js"></script>
</head>
<body>
<a-scene>
<a-entity foo></a-entity>
</a-scene>
</body>
</html>
Компонентная форма HTML
Компонент содержит ведро данных в виде одного или нескольких свойств компонента. Компоненты используют эти данные для модификации объектов. Рассмотрим компонент двигателя, мы можем определить такие свойства, как мощность или цилиндры.
Атрибуты HTML представляют собой имена компонентов, а значение этих атрибутов представляет данные компонента.
Компонент с одним свойством
Если компонент является компонентом с одним свойством, то есть его данные состоят из одного значения, то в HTML значение компонента выглядит как обычный атрибут HTML:
<!-- `position` is the name of the position component. -->
<!-- `1 2 3` is the data of the position component. -->
<a-entity position="1 2 3"></a-entity>
Компонент для нескольких объектов
Если компонент является многокомпонентным компонентом, то есть данные состоят из нескольких свойств и значений, то в HTML значение компонента напоминает встроенные стили CSS:
<!-- `light` is the name of the light component. -->
<!-- The `type` property of the light is set to `point`. -->
<!-- The `color` property of the light is set to `crimson`. -->
<a-entity light="type: point; color: crimson"></a-entity>
Определение объекта compnent schema
Схема - это объект, который определяет и описывает свойство или свойства компонента. Ключами схемы являются имена свойства, а значения схемы определяют типы и значения свойства (в случае многокомпонентного компонента):
Определение схемы в компоненте
AFRAME.registerComponent('bar', {
schema: {
color: {default: '#FFF'},
size: {type: 'int', default: 5}
}
}
Переопределить установленные по умолчанию схемы
<a-scene>
<a-entity bar="color: red; size: 20"></a-entity>
</a-scene>
Схема с одним имуществом
Компонент может быть либо компонентом с одним свойством (состоящим из одного анонимного значения), либо компонентом с несколькими свойствами (состоящим из нескольких именованных значений). A-Frame выведет, является ли компонент однокомпонентным или множественным свойством на основе структуры схемы.
Схема одного компонента компонента содержит ключи type
и / или по default
, а значения схемы - это простые значения, а не объекты:
AFRAME.registerComponent('foo', {
schema: {type: 'int', default: 5}
});
<a-scene>
<a-entity foo="20"></a-entity>
</a-scene>
Типы свойств схемы компонента A-Frame
Типы свойств в основном определяют, как схема анализирует входящие данные из DOM для каждого свойства. Затем анализируемые данные будут доступны через свойство data
на прототипе компонента. Ниже приведены встроенные типы свойств A-Frame:
Тип недвижимости | Описание | Значение по умолчанию |
---|---|---|
массив | Парсы разделяют запятыми значения массива (т. Е. "1, 2, 3" to ['1', '2', '3']) . | [] |
актив | Для URL-адресов, указывающих на общие активы. Может анализировать URL из строки в виде url(<url>) . Если значение является селектором идентификаторов элементов (например, #texture ), этот тип свойства вызывает getElementById и getAttribute('src') для возврата URL-адреса. Тип свойства asset может или не может быть изменен для обработки XHR или возврата MediaElements напрямую (например, элементы <img> ). | «» |
аудио | Такой же синтаксический анализ, как тип свойства asset . Возможно, он будет использоваться инспектором A-Frame для представления аудио-активов. | «» |
логический | Parses string для boolean (т.е. "false" для false, все остальное правдиво). | ложный |
цвет | В настоящее время не выполняется синтаксический анализ. В основном используется A-Frame Inspector для представления выбора цвета. Кроме того, для работы цветовой анимации требуется использовать цветной цвет. | #FFF |
ИНТ | Вызывает parseInt (например, "124.5" - 124 ). | 0 |
карта | Такой же синтаксический анализ, как тип свойства asset . Возможно, будет использован инспектор A-Frame для представления текстурных активов. | «» |
модель | Такой же синтаксический анализ, как тип свойства asset . Возможно, будет использован инспектор A-Frame для представления активов модели. | «» |
число | Вызывает parseFloat (например, от '124.5' до '124.5' ). | 0 |
селектор | Вызывает querySelector (например, "#box" на <a-entity id="box"> ). | ноль |
selectorAll | Вызовы querySelectorAll и преобразует NodeList в Array (например, ".boxes" на [<а-объект класса = "коробки", ...]), | ноль |
строка | Не выполняет синтаксический разбор. | «» |
vec2 | Вычисляет два числа в объект {x, y} (например, от 1 -2 до {x: 1, y: -2} . | {x: 0, y: 0} |
vec3 | Вычисляет три числа в объект {x, y, z} (например, от 1 -2 3 до {x: 1, y: -2, z: 3} . | {x: 0, y: 0, z: 0} |
vec4 | Вычисляет четыре числа в объект {x, y, z, w} (например, от 1 -2 3 -4.5 до {x: 1, y: -2, z: 3, w: -4.5} . | {x: 0, y: 0, z: 0, w: 0} |
Схема попытается вывести тип свойства, заданный только значением по умолчанию:
schema: {default: 10} // type: "number"
schema: {default: "foo"} // type: "string"
schema: {default: [1, 2, 3]} // type: "array"
Схема присваивает значение по умолчанию, если оно не указано, если задан тип свойства:
schema: {type: 'number'} // default: 0
schema: {type: 'string'} // default: ''
schema: {type: 'vec3'} // default: {x: 0, y: 0, z: 0}
Тип пользовательского типа Мы также можем определить наш собственный тип свойства или парсер, предоставляя функцию parse
вместо type
:
schema: {
// Parse slash-delimited string to an array
// (e.g., `foo="myProperty: a/b"` to `['a', 'b']`).
myProperty: {
default: [],
parse: function (value) {
return value.split('/');
}
}
}
Доступ к элементам и методам компонента
Элементы и методы компонента могут быть доступны через объект из объекта .components . Посмотрите компонент на карте компонентов объекта, и у нас будет доступ к внутренним компонентам компонента. Рассмотрим этот пример:
AFRAME.registerComponent('foo', {
init: function () {
this.bar = 'baz';
},
qux: function () {
// ...
}
});
Давайте перейдем к элементу bar и qux :
var fooComponent = document.querySelector('[foo]').components.foo;
console.log(fooComponent.bar);
fooComponent.qux();