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