Sök…


Introduktion

I enhetens komponent-systemmönster är en komponent en återanvändbar och modulär mängd data som vi ansluter till en enhet för att lägga till utseende, beteende och / eller funktionalitet.

I A-Frame ändrar komponenter enheter som är 3D-objekt i scenen. Vi blandar och komponerar komponenter för att bygga komplexa objekt. De låter oss inkapsla three.js och JavaScript-kod i moduler som vi kan använda deklarativt från HTML. Komponenter är i stort sett analoga med CSS.

Anmärkningar

Definition Lifecycle Handler Methods

Med schemat som anatomi är livscykelmetoderna fysiologi; schemat definierar formen på data, livscykelhanteraren använder metoderna för att modifiera enheten. Hanterarna kommer vanligtvis att interagera med Entity API .

Översikt över metoder

Metod Beskrivning
i det Ringer en gång när komponenten initialiseras. Används för att ställa in initialtillstånd och instansvariabler.
uppdatering Ringer både när komponenten initialiseras och när någon av komponentens egenskaper uppdateras (t.ex. via setAttribute ). Används för att ändra enheten.
ta bort Ringas när komponenten tas bort från enheten (t.ex. via removeAttribute ) eller när enheten tas bort från scenen. Används för att ångra alla tidigare ändringar av enheten.
bock Kallas på varje renderingsslinga eller fästing i scenen. Används för kontinuerliga ändringar eller kontroller.
spela Anropas när scenen eller enheten spelar för att lägga till bakgrund eller dynamiskt beteende. Kallas också en gång när komponenten initialiseras. Används för att starta eller återuppta beteende.
paus Anropas när scenen eller enheten pausar för att ta bort bakgrund eller dynamiskt beteende. Kallas också när komponenten tas bort från enheten eller när enheten tas bort från scenen. Används för att pausa beteende.
updateSchema Ringas när någon av komponentens egenskaper uppdateras. Kan användas för att dynamiskt modifiera schemat.

Komponentprototypegenskaper

Inom metoderna har vi tillgång till komponentprototypen via this :

Fast egendom Beskrivning
this.data Delade komponentegenskaper beräknade från schemans standardvärden, mixins och enhetens attribut.
this.el Hänvisning till [entitet] [entitet] som HTML-element.
this.el.sceneEl Hänvisning till [scenen] [scenen] som ett HTML-element.
this.id Om komponenten kan ha [flera instanser] [multipel], ID för komponentens enskilda instans (t.ex. foo från sound__foo ).

METODER

.i det ()

.init () kallas en gång i början av komponentens livscykel. En enhet kan ringa komponentens init hanterare:

  • När komponenten är statiskt inställd på enheten i HTML-filen och sidan laddas.
  • När komponenten är inställd på en bifogad enhet via setAttribute .
  • När komponenten är inställd på en icke kopplad enhet, och enheten kopplas sedan till scenen via appendChild .

init hanteraren används ofta för att:

  • Ställ in initialtillstånd och variabler
  • Bindningsmetoder
  • Bifoga evenemangets lyssnare

Till exempel skulle en markörkomponentens init ställa in tillståndsvariabler, binda metoder och lägga till händelse lyssnare:

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) kallas när komponentens egenskaper ändras, inklusive i början av komponentens livscykel. En enhet kan ringa en komponents update :

  • Efter init () kallas, i början av komponentens livscykel.
  • När komponentens egenskaper uppdateras med .setAttribute .

update används ofta för att:

  • Gör det mesta av arbetet med att göra ändringar av enheten med hjälp av this.data .
  • Ändra enheten när en eller flera komponentegenskaper ändras.

Granulära ändringar av enheten kan göras genom att [diffing] [diff] den nuvarande datasatsen ( this.data ) med föregående datasats före uppdateringen ( oldData ).

A-Frame anropar .update() både i början av komponentens livscykel och varje gång en komponents data ändras (t.ex. till följd av setAttribute ). Uppdateringshanteraren använder ofta this.data att ändra enheten. Uppdateringshanteraren har åtkomst till det tidigare tillståndet för en komponents data via sitt första argument. Vi kan använda tidigare data för en komponent för att berätta exakt vilka egenskaper som har ändrats för att göra granulära uppdateringar.

Till exempel anger den synliga komponentens update enhetens synlighet.

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

.ta bort ()

.remove () kallas närhelst komponenten kopplas bort från enheten. En enhet kan ringa en komponents remove :

  • När komponenten tas bort från enheten via removeAttribute .
  • När enheten är fristående från scenen (t.ex. ta removeChild ).

remove hanteraren används ofta för att:

  • Ta bort, ångra eller rensa upp alla komponentens ändringar av enheten.
  • Lossa evenemangets lyssnare.

Till exempel, när [ljuskomponenten] [ljuset] tas bort, kommer ljuskomponenten att ta bort det ljusobjekt som det tidigare hade ställts in på enheten, och därmed ta bort det från scenen.

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

.tick (tid, tidDelta)

.tick () kallas på varje fästing eller ram i scenens renderingsslinga. Scenen kommer att anropa en komponents tick hanterare:

  • På varje ram på renderingsslingan.
  • I storleksordningen 60 till 120 gånger per sekund.
  • Om enheten eller scenen inte är pausad (t.ex. är inspektören öppen).
  • Om enheten fortfarande är kopplad till scenen.

Den tick handler används ofta för att:

  • Modifiera enheten kontinuerligt i varje ram eller i ett intervall.
  • Undersökning för villkor.

tick hanteraren tillhandahåller den globala drifttiden för scenen i millisekunder ( time ) och tidsskillnaden i millisekunder sedan den sista ramen ( timeDelta ). Dessa kan användas för interpolering eller för att bara köra delar av tick på ett inställt intervall.

Till exempel kommer den spårade kontrollkomponenten att fortsätta kontrollerns animationer, uppdatera regulatorns position och rotation och kontrollera om knapptryckningar finns.

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

.paus ()

.pause () kallas när enheten eller scenen pausar. Enheten kan kalla en komponentens pause handler:

  • Innan komponenten tas bort, innan remove anropas.
  • När enheten är pausad med Entity.pause () .
  • När scenen är pausad med Scene.pause () (t.ex. inspektören öppnas).

Den pause handler används ofta för att:

  • Ta bort händelserna.
  • Ta bort alla chanser för dynamiskt beteende.

Till exempel kommer ljudkomponenten att pausa ljudet och ta bort en händelse lyssnare som skulle ha spelat ett ljud på en händelse:

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

.spela ()

.play () kallas när enheten eller scenen återupptas. Enheten kan kalla en komponentens play handler:

  • När komponenten först är ansluten efter att update har ringt.
  • När enheten pausades men återupptogs sedan med Entity.play () .
  • När scenen pausades men återupptogs sedan med Scene.play () .

Den play ofta använder för att:

  • Lägg till evenemangets lyssnare.

Till exempel kommer ljudkomponenten att spela upp ljudet och uppdatera händelsen lyssnaren som skulle spela ett ljud på en händelse:

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

.updateSchema (data)

.updateSchema () , om det definieras, kallas varje uppdatering för att kontrollera om schemat måste ändras dynamiskt.

updateSchema hanteraren används ofta för att:

  • Uppdatera eller utöka schemat dynamiskt, vanligtvis beroende på värdet på en egenskap.

Till exempel kontrollerar geometrikomponenten om den primitive egenskapen har ändrats för att avgöra om schemat ska uppdateras för en annan typ av geometri:

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

KOMPONENT PROTOTYPE METODER

.flushToDOM ()

För att spara på CPU-tid vid strängning kommer A-Frame endast att uppdatera i felsökningsläge komponentens serialiserade representation i själva DOM. Att ringa flushToDOM () kommer att manuellt serialisera komponentens data och uppdatera DOM:

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

Registrera en anpassad A-Frame-komponent

AFRAME.registerComponent (namn, definition)

Registrera en A-Frame-komponent. Vi måste registrera komponenter innan vi använder dem någonstans i . Med betydelse från en HTML-fil bör komponenter komma i ordning innan .

  • {string} name - Komponentnamn. Komponentens offentliga API, representerat genom ett HTML-attributnamn.
  • {Objekt} definition - Komponentdefinition. Innehåller scheman och livscykelhanteringsmetoder.

Registrera komponent i foo i din js-fil, t.ex. foo-component.js

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

Användning av foo- komponent i din scen

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

Komponent HTML-formulär

En komponent har en hink med data i form av en eller flera komponentegenskaper. Komponenter använder denna information för att ändra enheter. Tänk på en motorkomponent, vi kan definiera egenskaper som hästkrafter eller cylindrar.

HTML-attribut representerar komponentnamn och värdet på dessa attribut representerar komponentdata.

Komponent med en fastighet

Om en komponent är en komponent med en egenskap, vilket betyder att dess data består av ett enstaka värde, ser komponentvärdet ut som ett normalt HTML-attribut i 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>

Komponent med flera fastigheter

Om en komponent är en komponent med flera egenskaper, vilket innebär att data består av flera egenskaper och värden, liknar komponentvärdet i HTML-CSS-stilar i HTML:

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

Definiera komponentschemaobjekt

Schemat är ett objekt som definierar och beskriver komponentens egendom eller egenskaper. Schemans nycklar är egenskapens namn, och schemans värden definierar egenskapens typer och värden (i händelse av en komponent med flera egenskaper):

Definiera schema i din komponent

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

Överskridande av definierade schema som standard

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

Schema för en fastighet

En komponent kan antingen vara en komponent med en egenskap (bestående av ett anonymt värde) eller en komponent med flera egenskaper (bestående av flera namngivna värden). A-Frame kommer att sluta sig till om en komponent är enkelegenskap kontra multiegenskap baserat på schemans struktur.

Ett schema för en egenskapskomponent innehåller type och / eller default , och schemans värden är vanliga värden snarare än objekt:

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

A-Rams komponentschemaegenskapstyper

Egenskapstyper definierar primärt hur schemat analyserar inkommande data från DOM för varje egenskap. Den analyserad data kommer då att finnas tillgänglig via data fastighet på komponentens prototyp. Nedan finns A-Frame inbyggda egendomstyper:

Fastighetstyp Beskrivning Standardvärde
array Analyserar kommaseparerade värden till array (dvs. "1, 2, 3" to ['1', '2', '3']) . []
tillgång För webbadresser som pekar på allmänna tillgångar. Kan analysera URL från en sträng i form av url(<url>) . Om värdet är en element-ID-väljare (t.ex. #texture ), kommer den här egenskapstypen att ringa getElementById och getAttribute('src') att returnera en URL. Typ av asset kan ändras eller inte för att hantera XHR eller returnera MediaElements direkt (t.ex. <img> element). ''
audio Samma analysering som typen av asset . Kommer att användas av A-Frame Inspector för att presentera ljudtillgångar. ''
boolean Parsessträng till booleska (dvs. "false" till falskt, allt annat sanningsenligt). falsk
Färg För närvarande gör ingen analys. Används främst av A-Frame Inspector för att presentera en färgväljare. Det är också nödvändigt att använda färgtyp för att färga animationer ska fungera. #fff
int parseInt (t.ex. "124.5" till 124 ). 0
Karta Samma analysering som typen av asset . Kommer eventuellt att användas med A-Frame Inspector för att presentera texturtillgångar. ''
modell Samma analysering som typen av asset . Kommer eventuellt att användas med A-Frame Inspector för att presentera modelltillgångar. ''
siffra parseFloat (t.ex. '124.5' till '124.5' ). 0
väljare querySelector (t.ex. "#box" till <a-entity id="box"> ). null
selectorAll querySelectorAll och konverterar NodeList till Array (t.ex. ".boxes" till [<a-enhet class = "boxes", ...]), null
sträng Gör inte någon analys. ''
vec2 Delar två siffror i ett {x, y} -objekt (t.ex. 1 -2 till {x: 1, y: -2} . {x: 0, y: 0}
vec3 Delar in tre siffror i ett {x, y, z} -objekt (t.ex. 1 -2 3 till {x: 1, y: -2, z: 3} . {x: 0, y: 0, z: 0}
vec4 Delar fyra siffror i ett {x, y, z, w} -objekt (t.ex. 1 -2 3 -4.5 till {x: 1, y: -2, z: 3, w: -4.5} . {x: 0, y: 0, z: 0, w: 0}
Fastighetstyp Inferens

Schemat försöker sluta sig till en egenskapstyp med endast ett standardvärde:

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

Schemat ställer in ett standardvärde om det inte anges, med tanke på egenskapstypen:

schema: {type: 'number'}  // default: 0
schema: {type: 'string'}  // default: ''
schema: {type: 'vec3'}  // default: {x: 0, y: 0, z: 0}
Anpassad egendomstyp

Vi kan också definiera vår egen egendomstyp eller -delare genom att tillhandahålla en parse istället för en 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('/');
    }
  }
}

Få åtkomst till en komponents medlemmar och metoder

En komponents medlemmar och metoder kan nås via enheten från .components- objektet. Slå upp komponenten från enhetens karta över komponenter, så får vi tillgång till komponentens interna delar. Tänk på denna exempelkomponent:

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

Låt tillgång baren medlem och qux metod:

var fooComponent = document.querySelector('[foo]').components.foo;
console.log(fooComponent.bar);
fooComponent.qux();


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow