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 is appendChild .

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}
Eigendom Type Inferentie

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();


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow