aframe
Components
Zoeken…
Invoering
In het entiteit-component-systeempatroon is een component een herbruikbaar en modulair stuk gegevens dat we in een entiteit stoppen om uiterlijk, gedrag en / of functionaliteit toe te voegen.
In A-Frame wijzigen componenten entiteiten die 3D-objecten in de scène zijn. We mixen en componeren componenten om complexe objecten te bouwen. Ze laten ons three.js en JavaScript-code inkapselen in modules die we declaratief kunnen gebruiken vanuit HTML. Componenten zijn ongeveer analoog aan CSS.
Opmerkingen
Definitie Lifecycle Handler-methoden
Met het schema als de anatomie, zijn de levenscyclusmethoden de fysiologie; het schema definieert de vorm van de gegevens, de lifecycle handler-methoden gebruiken de gegevens om de entiteit te wijzigen. De handlers zullen meestal communiceren met de Entity API .
Overzicht van methoden
Methode | Beschrijving |
---|---|
in het | Een keer aangeroepen wanneer het onderdeel is geïnitialiseerd. Wordt gebruikt om de initiële status in te stellen en variabelen te instantiëren. |
bijwerken | Wordt zowel aangeroepen wanneer de component wordt geïnitialiseerd als wanneer een van de eigenschappen van de component wordt bijgewerkt (bijvoorbeeld via setAttribute ). Wordt gebruikt om de entiteit te wijzigen. |
verwijderen | Wordt aangeroepen wanneer de component wordt verwijderd uit de entiteit (bijvoorbeeld via removeAttribute ) of wanneer de entiteit wordt losgekoppeld van de scène. Gebruikt om alle eerdere wijzigingen aan de entiteit ongedaan te maken. |
Kruis aan | Opgeroepen bij elke renderlus of tik van de scène. Wordt gebruikt voor continue wijzigingen of controles. |
Speel | Wordt opgeroepen wanneer de scène of entiteit speelt om achtergrond- of dynamisch gedrag toe te voegen. Wordt ook een keer genoemd wanneer het onderdeel wordt geïnitialiseerd. Wordt gebruikt om gedrag te starten of te hervatten. |
pauze | Wordt opgeroepen wanneer de scène of entiteit pauzeert om achtergrond- of dynamisch gedrag te verwijderen. Wordt ook genoemd wanneer de component wordt verwijderd uit de entiteit of wanneer de entiteit wordt losgekoppeld van de scène. Wordt gebruikt om gedrag te pauzeren. |
updateSchema | Wordt aangeroepen wanneer een van de eigenschappen van het onderdeel wordt bijgewerkt. Kan worden gebruikt om het schema dynamisch aan te passen. |
Onderdeel Prototype Eigenschappen
Binnen de methoden hebben we via this
toegang tot het prototype van de component:
Eigendom | Beschrijving |
---|---|
Deze data | Parsed-componenteigenschappen berekend op basis van de standaardwaarden van het schema, mixins en de kenmerken van de entiteit. |
this.el | Verwijzing naar de [entiteit] [entiteit] als een HTML-element. |
this.el.sceneEl | Verwijzing naar de [scene] [scene] als een HTML-element. |
this.id | Als de component [meerdere instanties] [meerdere] kan hebben, de ID van de individuele instantie van de component (bijvoorbeeld foo van sound__foo ). |
METHODEN
.in het ()
.init ()
wordt eenmaal aan het begin van de levenscyclus van de component aangeroepen. Een entiteit kan de init
handler van de component aanroepen:
- Wanneer de component statisch is ingesteld op de entiteit in het HTML-bestand en de pagina is geladen.
- Wanneer de component is ingesteld op een gekoppelde entiteit via
setAttribute
. - Wanneer de component is ingesteld op een niet-gekoppelde entiteit en de entiteit vervolgens via
appendChild
aan de scène isappendChild
.
De init
handler wordt vaak gebruikt om:
- Stel de initiële status en variabelen in
- Bindmethoden
- Voeg gebeurtenisluisteraars toe
De init
een cursorcomponent zou bijvoorbeeld init
instellen, bindmethoden en gebeurtenislisteners toevoegen:
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 (oudeData)
.update (oldData)
wordt aangeroepen wanneer de eigenschappen van de component veranderen, ook aan het begin van de levenscyclus van de component. Een entiteit kan de update
handler van een component aanroepen:
- Nadat
init ()
wordt aangeroepen, aan het begin van de levenscyclus van een component. - Wanneer de eigenschappen van de component worden bijgewerkt met
.setAttribute
.
De update
handler wordt vaak gebruikt om:
- Voer het meeste werk uit bij het aanbrengen van wijzigingen in de entiteit, met behulp van
this.data
. - Wijzig de entiteit wanneer een of meer componenteigenschappen veranderen.
Gedetailleerde aanpassingen aan de entiteit kunnen worden gedaan door [diffing] [diff] de huidige gegevensset ( this.data
) met de vorige gegevensset vóór de update ( oldData
).
A-Frame roept .update()
zowel aan het begin van de levenscyclus van een component als telkens wanneer de gegevens van een component veranderen (bijvoorbeeld als gevolg van setAttribute
). De update-handler gebruikt vaak this.data
om de entiteit te wijzigen. De update-handler heeft via het eerste argument toegang tot de vorige status van de gegevens van een component. We kunnen de vorige gegevens van een component gebruiken om precies te weten welke eigenschappen zijn gewijzigd om gedetailleerde updates uit te voeren.
De update
de zichtbare component stelt bijvoorbeeld de zichtbaarheid van de entiteit in.
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 ()
wordt aangeroepen wanneer de component wordt losgekoppeld van de entiteit. Een entiteit kan de remove
handler van een component aanroepen:
- Wanneer het onderdeel uit de entiteit wordt verwijderd via
removeAttribute
. - Wanneer de entiteit wordt losgekoppeld van de scène (bijvoorbeeld
removeChild
).
De remove
wordt vaak gebruikt om:
- Verwijder alle wijzigingen van de component aan de entiteit, maak deze ongedaan of ruim ze op.
- Maak gebeurtenisluisteraars los.
Wanneer bijvoorbeeld de [lichtcomponent] [licht] wordt verwijderd, verwijdert de lichtcomponent het lichtobject dat het eerder op de entiteit had ingesteld, waardoor het uit de scène werd verwijderd.
AFRAME.registerComponent('light', {
// ...
remove: function () {
this.el.removeObject3D('light');
}
// ...
});
.tick (time, timeDelta)
.tick ()
wordt aangeroepen bij elke tik of elk frame van de .tick ()
van de scène. De scène roept de tick
een component aan:
- Op elk frame van de render-lus.
- In de orde van 60 tot 120 keer per seconde.
- Als de entiteit of scène niet is gepauzeerd (de inspecteur is bijvoorbeeld geopend).
- Als de entiteit nog steeds aan de scène is gekoppeld.
De tick
handler wordt vaak gebruikt om:
- Wijzig de entiteit continu op elk frame of op een interval.
- Poll voor voorwaarden.
De tick
geleider verschaft de globale inzetbaarheid van de scène in milliseconden ( time
) en het tijdsverschil in milliseconden sinds het laatste frame ( timeDelta
). Deze kunnen worden gebruikt voor interpolatie of pas te lopen delen van de tick
handler op vaste intervallen.
De component met bijgehouden besturingselementen zal bijvoorbeeld de animaties van de controller voortzetten, de positie en rotatie van de controller bijwerken en controleren of er op een knop wordt gedrukt.
AFRAME.registerComponent('tracked-controls', {
// ...
tick: function (time, timeDelta) {
this.updateMeshAnimation();
this.updatePose();
this.updateButtons();
}
// ...
});
.pause ()
.pause ()
wordt aangeroepen wanneer de entiteit of scène pauzeert. De entiteit kan een component noemen pause
handler:
- Voordat het onderdeel wordt verwijderd, voordat de
remove
handler wordt aangeroepen. - Wanneer de entiteit is gepauzeerd met
Entity.pause ()
. - Wanneer de scène wordt gepauzeerd met
Scene.pause ()
(de Inspector wordt bijvoorbeeld geopend).
De pause
handler wordt vaak gebruikt om:
- Verwijder gebeurtenisluisteraars.
- Verwijder alle kansen op dynamisch gedrag.
De geluidscomponent onderbreekt bijvoorbeeld het geluid en verwijdert een gebeurtenislistener die een geluid op een gebeurtenis zou hebben afgespeeld:
AFRAME.registerComponent('sound', {
// ...
pause: function () {
this.pauseSound();
this.removeEventListener();
}
// ...
});
.Speel ()
.play ()
wordt opgeroepen wanneer de entiteit of scène wordt hervat. De entiteit kan de play
handler van een component aanroepen:
- Wanneer de component voor het eerst wordt gekoppeld, wordt de
update
handler aangeroepen. - Wanneer de entiteit is onderbroken maar vervolgens is hervat met
Entity.play ()
. - Wanneer de scène werd gepauzeerd maar vervolgens werd hervat met
Scene.play ()
.
De play
-handler wordt vaak gebruikt om:
- Voeg gebeurtenisluisteraars toe.
De geluidscomponent speelt bijvoorbeeld het geluid af en werkt de gebeurtenislistener bij die een geluid op een gebeurtenis zou afspelen:
AFRAME.registerComponent('sound', {
// ...
play: function () {
if (this.data.autoplay) { this.playSound(); }
this.updateEventListener();
}
// ...
});
.updateSchema (gegevens)
.updateSchema ()
, indien gedefinieerd, wordt bij elke update aangeroepen om te controleren of het schema dynamisch moet worden gewijzigd.
De updateSchema
handler wordt vaak gebruikt om:
- Werk het schema dynamisch bij of verleng het, meestal afhankelijk van de waarde van een eigenschap.
De geometriecomponent controleert bijvoorbeeld of de primitive
eigenschap is gewijzigd om te bepalen of het schema moet worden bijgewerkt voor een ander type geometrie:
AFRAME.registerComponent('geometry', {
// ...
updateSchema: (newData) {
if (newData.primitive !== this.data.primitive) {
this.extendSchema(GEOMETRIES[newData.primitive].schema);
}
}
// ...
});
COMPONENTEN PROTOTYPE METHODEN
.flushToDOM ()
Om CPU-tijd te besparen bij stringificatie, werkt A-Frame alleen in de foutopsporingsmodus de geserialiseerde weergave van de component in de werkelijke DOM bij. Door flushToDOM () aan te roepen, worden de gegevens van de component handmatig geserialiseerd en wordt de DOM bijgewerkt:
document.querySelector('[geometry]').components.geometry.flushToDOM();
Registreer een aangepast A-Frame-component
AFRAME.registerComponent (naam, definitie)
Registreer een A-Frame-component. We moeten componenten registreren voordat we ze ergens gebruiken . Betekenis van een HTML-bestand, componenten moeten eerder op volgorde komen .
- {string} naam - componentnaam. De openbare API van het onderdeel zoals weergegeven via een HTML-kenmerknaam.
- {Object} definition - Definitie van componenten. Bevat methoden voor het hanteren van schema's en levenscyclus.
Onderdeel in foo registreren in uw js-bestand, bijvoorbeeld foo-component.js
AFRAME.registerComponent('foo', {
schema: {},
init: function () {},
update: function () {},
tick: function () {},
remove: function () {},
pause: function () {},
play: function () {}
});
Gebruik van foo- component in uw 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>
Component HTML-formulier
Een component bevat een emmer met gegevens in de vorm van een of meer componenteigenschappen. Componenten gebruiken deze gegevens om entiteiten te wijzigen. Overweeg een motorcomponent, we kunnen eigenschappen definiëren zoals paardenkracht of cilinders.
HTML-attributen vertegenwoordigen componentnamen en de waarde van die attributen vertegenwoordigen componentgegevens.
Onderdeel met één eigenschap
Als een component een component met één eigenschap is, wat betekent dat de gegevens uit één waarde bestaan, ziet de componentwaarde in HTML eruit als een normaal HTML-kenmerk:
<!-- `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>
Component met meerdere eigenschappen
Als een component een component met meerdere eigenschappen is, wat betekent dat de gegevens uit meerdere eigenschappen en waarden bestaan, lijkt de componentwaarde in HTML op inline CSS-stijlen:
<!-- `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>
Definiërend schema-object
Het schema is een object dat de eigenschap of eigenschappen van de component definieert en beschrijft. De sleutels van het schema zijn de namen van de eigenschap en de waarden van het schema definiëren de typen en waarden van de eigenschap (in het geval van een component met meerdere eigenschappen):
Schema definiëren in uw component
AFRAME.registerComponent('bar', {
schema: {
color: {default: '#FFF'},
size: {type: 'int', default: 5}
}
}
Gedefinieerde standaardinstellingen van het schema overschrijven
<a-scene>
<a-entity bar="color: red; size: 20"></a-entity>
</a-scene>
Schema met één eigenschap
Een component kan een component met één eigenschap zijn (bestaande uit één anonieme waarde) of een component met meerdere eigenschappen (bestaande uit meerdere benoemde waarden). A-Frame zal afleiden of een component single-property versus multi-property is op basis van de structuur van het schema.
Het schema van een component met één eigenschap bevat type
en / of default
en de waarden van het schema zijn gewone waarden in plaats van objecten:
AFRAME.registerComponent('foo', {
schema: {type: 'int', default: 5}
});
<a-scene>
<a-entity foo="20"></a-entity>
</a-scene>
A-Frame's eigenschappen van componentschema's
Eigenschapstypen definiëren primair hoe het schema binnenkomende gegevens uit de DOM parseert voor elke eigenschap. De ontlede gegevens zijn dan beschikbaar via de eigenschap data
op het prototype van de component. Hieronder staan de ingebouwde eigenschapstypen van A-Frame:
Eigendom type | Beschrijving | Standaardwaarde |
---|---|---|
rangschikking | Parseert door komma's gescheiden waarden in een array (dwz "1, 2, 3" to ['1', '2', '3']) . | [] |
Bedrijfsmiddel | Voor URL's die verwijzen naar algemene elementen. Kan URL uit een string ontleden in de vorm van url(<url>) . Als de waarde een element-ID selector is (bijvoorbeeld #texture ), #texture dit eigenschapstype getElementById en getAttribute('src') aan om een URL te retourneren. De asset woningtype al dan niet wijzigen XHR's of terugkeer MediaElements direct behandelen (bv <img> elementen). | '' |
audio | Zelfde parsing als de asset eigenschap type. Wordt mogelijk door de A-Frame Inspector gebruikt om audiomiddelen te presenteren. | '' |
boolean | Parses string to boolean (ie "false" naar false, al het andere waarheidsgetrouw). | vals |
kleur | Momenteel wordt er niet geparseerd. Voornamelijk gebruikt door de A-Frame Inspector om een kleurenkiezer te presenteren. Het is ook nodig om het kleurtype te gebruiken om kleurenanimaties te laten werken. | #fff |
int | Roept parseInt (bijv. "124.5" tot 124 ). | 0 |
kaart | Zelfde parsing als de asset eigenschap type. Wordt mogelijk met de A-Frame Inspector gebruikt om textuurelementen te presenteren. | '' |
model- | Zelfde parsing als de asset eigenschap type. Wordt mogelijk met de A-Frame Inspector gebruikt om modelactiva te presenteren. | '' |
aantal | Roept parseFloat (bijvoorbeeld '124.5' tot '124.5' ). | 0 |
keuzeschakelaar | Roept querySelector (bijvoorbeeld "#box" naar <a-entity id="box"> ). | nul |
selectorAll | Roept querySelectorAll en converteert NodeList naar Array (bijv. ".boxes" naar [<a-entity class = "boxes", ...]), | nul |
draad | Past geen parsering toe. | '' |
vec2 | Parseert twee getallen in een {x, y} -object (bijvoorbeeld 1 -2 tot {x: 1, y: -2} . | {x: 0, y: 0} |
vec3 | Parseert drie getallen in een object {x, y, z} (bijvoorbeeld 1 -2 3 tot {x: 1, y: -2, z: 3} . | {x: 0, y: 0, z: 0} |
vec4 | Parseert vier getallen in een {x, y, z, w} object (bijv. 1 -2 3 -4.5 tot {x: 1, y: -2, z: 3, w: -4.5} . | {x: 0, y: 0, z: 0, w: 0} |
Het schema zal proberen een eigenschapstype af te leiden met alleen een standaardwaarde:
schema: {default: 10} // type: "number"
schema: {default: "foo"} // type: "string"
schema: {default: [1, 2, 3]} // type: "array"
Het schema stelt een standaardwaarde in als deze niet wordt opgegeven, gezien het eigenschapstype:
schema: {type: 'number'} // default: 0
schema: {type: 'string'} // default: ''
schema: {type: 'vec3'} // default: {x: 0, y: 0, z: 0}
Aangepast eigenschapstype We kunnen ook ons eigen eigenschapstype of parser definiëren door een parse
functie te bieden in plaats van een 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('/');
}
}
}
Toegang tot de leden en methoden van een component
De leden en methoden van een component zijn toegankelijk via de entiteit vanuit het .components- object. Zoek de component op in de componentenkaart van de entiteit en we hebben toegang tot de interne onderdelen van de component. Beschouw dit voorbeeldonderdeel:
AFRAME.registerComponent('foo', {
init: function () {
this.bar = 'baz';
},
qux: function () {
// ...
}
});
Laten we toegang tot de bar-lid en qux methode:
var fooComponent = document.querySelector('[foo]').components.foo;
console.log(fooComponent.bar);
fooComponent.qux();