Поиск…


Вступление

В шаблоне 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();


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow