aframe
Composants
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} |
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();