Recherche…


Introduction

Dans le modèle entité-composant-système, un composant est un bloc de données réutilisable et modulaire que nous connectons à une entité pour ajouter une apparence, un comportement et / ou une fonctionnalité.

Dans A-Frame, les composants modifient des entités qui sont des objets 3D dans la scène. Nous mélangeons et composons des composants pour construire des objets complexes. Ils nous ont permis d’encapsuler three.js et le code JavaScript dans des modules que nous pouvons utiliser de manière déclarative à partir de HTML. Les composants sont à peu près analogues à CSS.

Remarques

Méthodes de gestion du cycle de vie des définitions

Le schéma étant l'anatomie, les méthodes du cycle de vie sont la physiologie; le schéma définit la forme des données, les méthodes du gestionnaire de cycle de vie utilisent les données pour modifier l'entité. Les gestionnaires interagissent généralement avec l' API Entity .

Vue d'ensemble des méthodes

Méthode La description
init Appelé une fois lorsque le composant est initialisé. Utilisé pour définir l'état initial et instancier les variables.
mettre à jour Appelé à la fois lors de l'initialisation du composant et lors de la mise à jour des propriétés du composant (par exemple, via setAttribute ). Utilisé pour modifier l'entité.
retirer Appelé lorsque le composant est supprimé de l'entité (par exemple via removeAttribute ) ou lorsque l'entité est détachée de la scène. Utilisé pour annuler toutes les modifications précédentes apportées à l'entité.
cocher Appelé à chaque boucle de rendu ou à chaque tick de la scène. Utilisé pour des modifications ou des vérifications continues.
jouer Appelé chaque fois que la scène ou l'entité joue pour ajouter un comportement d'arrière-plan ou dynamique. Aussi appelé une fois lorsque le composant est initialisé. Utilisé pour démarrer ou reprendre le comportement.
pause Appelé chaque fois que la scène ou l'entité s'interrompt pour supprimer tout comportement en arrière-plan ou dynamique. Appelé également lorsque le composant est supprimé de l'entité ou lorsque l'entité est détachée de la scène. Utilisé pour interrompre le comportement.
updateSchema Appelé chaque fois que l'une des propriétés du composant est mise à jour. Peut être utilisé pour modifier dynamiquement le schéma.

Propriétés du prototype de composant

Dans les méthodes, nous avons accès au composant prototype via this :

Propriété La description
this.data Propriétés du composant analysé calculées à partir des valeurs par défaut du schéma, des mixins et des attributs de l'entité.
this.el Référence à l'entité [entité] en tant qu'élément HTML.
this.el.sceneEl Référence à la [scène] [scène] en tant qu’élément HTML.
this.id Si le composant peut avoir [plusieurs instances] [multiple], l'ID de l'instance individuelle du composant (par exemple, foo from sound__foo ).

Méthodes

.init ()

.init () est appelée une fois au début du cycle de vie du composant. Une entité peut appeler le gestionnaire d' init du composant:

  • Lorsque le composant est défini de manière statique sur l'entité dans le fichier HTML et que la page est chargée.
  • Lorsque le composant est défini sur une entité attachée via setAttribute .
  • Lorsque le composant est défini sur une entité non attachée et que l'entité est alors attachée à la scène via appendChild .

Le gestionnaire d' init est souvent utilisé pour:

  • Configurer l'état initial et les variables
  • Méthodes de liaison
  • Joindre des écouteurs d'événement

Par exemple, l' init un composant de curseur définirait des variables d'état, lierait des méthodes et ajouterait des écouteurs d'événement:

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) est appelée chaque fois que les propriétés du composant sont modifiées, y compris au début du cycle de vie du composant. Une entité peut appeler le gestionnaire de update un composant:

  • Une fois init () appelé, au début du cycle de vie du composant.
  • Lorsque les propriétés du composant sont mises à jour avec .setAttribute .

Le gestionnaire de update est souvent utilisé pour:

  • Faites le gros du travail pour apporter des modifications à l’entité, en utilisant this.data .
  • Modifiez l'entité chaque fois qu'une ou plusieurs propriétés de composant sont modifiées.

Des modifications granulaires de l'entité peuvent être effectuées en [différant] [diff] le jeu de données actuel ( this.data ) avec le jeu de données précédent avant la mise à jour ( oldData ).

A-Frame appelle .update() à la fois au début du cycle de vie d'un composant et à chaque modification des données d'un composant (par exemple, à la suite de setAttribute ). Le gestionnaire de mise à jour utilise souvent this.data pour modifier l'entité. Le gestionnaire de mise à jour a accès à l'état précédent des données d'un composant via son premier argument. Nous pouvons utiliser les données précédentes d'un composant pour déterminer exactement les propriétés modifiées pour effectuer des mises à jour granulaires.

Par exemple, la update du composant visible définit la visibilité de l'entité.

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;
  }
  // ...
});

.retirer ()

.remove () est appelée chaque fois que le composant est détaché de l'entité. Une entité peut appeler le gestionnaire de remove un composant:

  • Lorsque le composant est supprimé de l'entité via removeAttribute .
  • Lorsque l'entité est détachée de la scène (par exemple, removeChild ).

Le gestionnaire de remove est souvent utilisé pour:

  • Supprimez, annulez ou nettoyez toutes les modifications apportées au composant dans l'entité.
  • Détachez les écouteurs d'événements.

Par exemple, lorsque le composant [light] [light] est supprimé, le composant light supprime l’objet lumineux qu’il a précédemment défini sur l’entité, le supprimant ainsi de la scène.

AFRAME.registerComponent('light', {
  // ...
  remove: function () {
    this.el.removeObject3D('light');
  }
  // ...
});

.tick (heure, timeDelta)

.tick () est appelé à chaque tick ou frame de la boucle de rendu de la scène. La scène appellera le gestionnaire de tick un composant:

  • Sur chaque image de la boucle de rendu.
  • De l’ordre de 60 à 120 fois par seconde.
  • Si l'entité ou la scène n'est pas en pause (par exemple, l'inspecteur est ouvert).
  • Si l'entité est toujours attachée à la scène.

Le gestionnaire de tick est souvent utilisé pour:

  • Modifier continuellement l'entité sur chaque image ou sur un intervalle.
  • Sondage pour les conditions.

La tick gestionnaire est fourni le temps de fonctionnement global de la scène en millisecondes ( time ) et la différence de temps en millisecondes depuis la dernière image ( timeDelta ). Ceux - ci peuvent être utilisés pour l' interpolation ou seulement des parties d'exécution de la tick gestionnaire sur un intervalle défini.

Par exemple, le composant des contrôles suivis fera progresser les animations du contrôleur, mettra à jour la position et la rotation du contrôleur et vérifiera si les boutons sont pressés.

AFRAME.registerComponent('tracked-controls', {
  // ...
  tick: function (time, timeDelta) {
    this.updateMeshAnimation();
    this.updatePose();
    this.updateButtons();
  }
  // ...
});

.pause ()

.pause () est appelée lorsque l'entité ou la scène est en pause. L'entité peut appeler le gestionnaire de pause un composant:

  • Avant la suppression du composant, avant l'appel du gestionnaire de remove .
  • Lorsque l'entité est en pause avec Entity.pause () .
  • Lorsque la scène est mise en pause avec Scene.pause () (par exemple, l'inspecteur est ouvert).

Le gestionnaire de pause est souvent utilisé pour:

  • Supprimer les écouteurs d'événement.
  • Supprimer toutes les chances de comportement dynamique.

Par exemple, le composant audio mettra le son en pause et supprimera un écouteur d'événement qui aurait joué un son lors d'un événement:

AFRAME.registerComponent('sound', {
  // ...
  pause: function () {
    this.pauseSound();
    this.removeEventListener();
  }
  // ...
});

.jouer ()

.play () est appelée lorsque l'entité ou la scène reprend. L'entité peut appeler le gestionnaire de play un composant:

  • Lorsque le composant est connecté pour la première fois, après l'appel du gestionnaire de update .
  • Lorsque l'entité a été mise en pause mais a ensuite repris avec Entity.play () .
  • Lorsque la scène a été mise en pause, puis reprise avec Scene.play () .

Le gestionnaire de play est souvent utilisé pour:

  • Ajouter des écouteurs d'événement.

Par exemple, le composant audio jouera le son et mettra à jour l’écouteur d’événement qui émettra un son lors d’un événement:

AFRAME.registerComponent('sound', {
  // ...
  play: function () {
    if (this.data.autoplay) { this.playSound(); }
    this.updateEventListener();
  }
  // ...
});

.updateSchema (data)

.updateSchema () , s'il est défini, est appelé à chaque mise à jour pour vérifier si le schéma doit être modifié dynamiquement.

Le gestionnaire updateSchema est souvent utilisé pour:

  • Mettre à jour ou étendre dynamiquement le schéma, généralement en fonction de la valeur d'une propriété.

Par exemple, le composant géométrique vérifie si la propriété primitive modifiée pour déterminer s'il faut mettre à jour le schéma pour un type de géométrie différent:

AFRAME.registerComponent('geometry', {
  // ...
  updateSchema: (newData) {
    if (newData.primitive !== this.data.primitive) {
      this.extendSchema(GEOMETRIES[newData.primitive].schema);
    }
  }
  // ...
});

METHODES DE PROTOTYPE DE COMPOSANTS

.flushToDOM ()

Pour économiser sur le temps de calcul de la chaîne, A-Frame ne mettra à jour en mode débogage que la représentation sérialisée du composant dans le DOM réel. L'appel de flushToDOM () sérialisera manuellement les données du composant et mettra à jour le DOM:

document.querySelector('[geometry]').components.geometry.flushToDOM();

Enregistrer un composant A-Frame personnalisé

AFRAME.registerComponent (nom, définition)

Enregistrez un composant A-Frame. Nous devons enregistrer les composants avant de les utiliser n'importe où . Signification à partir d'un fichier HTML, les composants doivent venir dans l'ordre avant .

  • {string} name - Nom du composant. API publique du composant représentée par un nom d'attribut HTML.
  • Définition {Object} - Définition du composant. Contient des méthodes de schéma et de gestionnaire de cycle de vie.

Enregistrement du composant dans foo dans votre fichier js, par exemple foo-component.js

AFRAME.registerComponent('foo', {
  schema: {},
  init: function () {},
  update: function () {},
  tick: function () {},
  remove: function () {},
  pause: function () {},
  play: function () {}
});

Utilisation du composant foo dans votre scène

<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>

Formulaire HTML composant

Un composant contient un groupe de données sous la forme d'une ou plusieurs propriétés du composant. Les composants utilisent ces données pour modifier des entités. Considérons un composant de moteur, nous pourrions définir des propriétés telles que la puissance ou les cylindres.

Les attributs HTML représentent les noms des composants et la valeur de ces attributs représente les données des composants.

Composant propriété unique

Si un composant est un composant à propriété unique, ce qui signifie que ses données consistent en une seule valeur, alors en HTML, la valeur du composant ressemble à un attribut HTML normal:

<!-- `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>

Composant Multi-Property

Si un composant est un composant multi-propriété, ce qui signifie que les données sont composées de plusieurs propriétés et valeurs, alors en HTML, la valeur du composant ressemble aux styles CSS inline:

<!-- `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>

Définir un objet de schéma de calcul

Le schéma est un objet qui définit et décrit la ou les propriétés du composant. Les clés du schéma sont les noms de la propriété et les valeurs du schéma définissent les types et les valeurs de la propriété (dans le cas d'un composant multi-propriété):

Définition du schéma dans votre composant

AFRAME.registerComponent('bar', {
  schema: {
    color: {default: '#FFF'},
    size: {type: 'int', default: 5}
  }
}

Remplacer les valeurs par défaut du schéma définies

<a-scene>
  <a-entity bar="color: red; size: 20"></a-entity>
</a-scene>

Schéma de propriété unique

Un composant peut être un composant à propriété unique (constitué d'une valeur anonyme) ou un composant à propriétés multiples (constitué de plusieurs valeurs nommées). A-Frame déduira si un composant est une propriété unique ou une propriété multiple en fonction de la structure du schéma.

Le schéma d'un composant à propriété unique contient default clés de type et / ou default , et les valeurs du schéma sont des valeurs simples plutôt que des objets:

AFRAME.registerComponent('foo', {
  schema: {type: 'int', default: 5}
});
<a-scene>
  <a-entity foo="20"></a-entity>
</a-scene>

Types de propriété de schéma de composant A-Frame

Les types de propriété définissent principalement la manière dont le schéma analyse les données entrantes provenant du DOM pour chaque propriété. Les données analysées seront alors disponibles via la propriété data sur le prototype du composant. Vous trouverez ci-dessous les types de propriétés intégrés à A-Frame:

Type de propriété La description Valeur par défaut
tableau Analyse les valeurs séparées par des virgules dans un tableau (c.-à-d. "1, 2, 3" to ['1', '2', '3']) . []
atout Pour les URL pointant vers des ressources générales. Peut analyser l'URL d'une chaîne sous la forme d' url(<url>) . Si la valeur est un sélecteur d'ID d'élément (par exemple, #texture ), ce type de propriété appelle getElementById et getAttribute('src') pour renvoyer une URL. Le type de propriété d' asset peut ou peut ne pas être modifié pour gérer les XHR ou renvoyer directement les MediaElements (par exemple, les éléments <img> ). ''
l'audio Même analyse que le type de propriété d' asset . Sera éventuellement utilisé par l'inspecteur A-Frame pour présenter des ressources audio. ''
booléen Analyse la chaîne en booléen (c.-à-d. "false" à false, tout le reste est vrai). faux
Couleur Ne fait actuellement aucune analyse. Principalement utilisé par l'inspecteur A-Frame pour présenter un sélecteur de couleur. En outre, il est nécessaire d'utiliser le type de couleur pour que les animations couleur fonctionnent. #FFF
int Appelle l' parseInt (par exemple, "124.5" à 124 ). 0
carte Même analyse que le type de propriété d' asset . Peut-être sera-t-il utilisé par l'inspecteur A-Frame pour présenter les éléments de texture. ''
modèle Même analyse que le type de propriété d' asset . Peut-être sera-t-il utilisé par l’inspecteur A-Frame pour présenter les actifs du modèle. ''
nombre Appelle parseFloat (par exemple, '124.5' à '124.5' ). 0
sélecteur Appelle querySelector (par exemple, "#box" à <a-entity id="box"> ). nul
sélecteurTous Appelle querySelectorAll et convertit NodeList en Array (par exemple, ".boxes" en [<a-entity class = "boxes", ...]), nul
chaîne Ne fait aucune analyse. ''
vec2 Analyse deux nombres dans un objet {x, y} (par exemple, 1 -2 à {x: 1, y: -2} . {x: 0, y: 0}
vec3 Analyse trois nombres en un objet {x, y, z} (par exemple, 1 -2 3 à {x: 1, y: -2, z: 3} . {x: 0, y: 0, z: 0}
vec4 Analyse quatre nombres en un objet {x, y, z, w} (par exemple, 1 -2 3 -4.5 à {x: 1, y: -2, z: 3, w: -4.5} . {x: 0, y: 0, z: 0, w: 0}
Type de propriété Inférence

Le schéma essaiera d'inférer un type de propriété uniquement avec une valeur par défaut:

schema: {default: 10}  // type: "number"
schema: {default: "foo"}  // type: "string"
schema: {default: [1, 2, 3]}  // type: "array"

Le schéma définira une valeur par défaut s'il n'est pas fourni, en fonction du type de propriété:

schema: {type: 'number'}  // default: 0
schema: {type: 'string'}  // default: ''
schema: {type: 'vec3'}  // default: {x: 0, y: 0, z: 0}
Type de propriété personnalisée

Nous pouvons également définir notre propre type de propriété ou analyseur en fournissant une fonction d' parse à la place d'un 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('/');
    }
  }
}

Accéder aux membres et aux méthodes d'un composant

Les membres et les méthodes d'un composant sont accessibles via l'entité de l'objet .components . Recherchez le composant à partir de la carte des composants de l'entité et nous aurons accès aux composants internes du composant. Considérez cet exemple de composant:

AFRAME.registerComponent('foo', {
  init: function () {
    this.bar = 'baz';
  },
  qux: function () {
    // ...
  }
});

Accédons au membre barre et à la méthode 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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow