aframe
składniki
Szukaj…
Wprowadzenie
We wzorcu encja-komponent-system komponent to wielokrotnego użytku i modułowy fragment danych, który podłączamy do encji w celu dodania wyglądu, zachowania i / lub funkcjonalności.
W ramce A komponenty modyfikują byty, które są obiektami 3D na scenie. Łączymy i komponujemy komponenty, aby budować złożone obiekty. Pozwalają nam enkapsulować trzy.js i kod JavaScript w moduły, których możemy używać deklaratywnie z HTML. Komponenty są z grubsza analogiczne do CSS.
Uwagi
Definicja Metody obsługi cyklu życia
Ponieważ schemat jest anatomią, metodami cyklu życia są fizjologia; schemat określa kształt danych, metody modułu obsługi cyklu życia wykorzystują dane do modyfikacji obiektu. Procedury obsługi zwykle będą oddziaływać z interfejsem API jednostki .
Przegląd metod
metoda | Opis |
---|---|
w tym | Wywoływany raz podczas inicjowania komponentu. Służy do konfigurowania stanu początkowego i tworzenia zmiennych. |
aktualizacja | Wywoływany zarówno przy inicjalizacji komponentu, jak i po każdej aktualizacji jego właściwości (np. Poprzez setAttribute ). Służy do modyfikowania encji. |
usunąć | Wywoływany, gdy komponent jest usuwany z encji (np. Przez removeAttribute ) lub gdy encja jest odłączana od sceny. Służy do cofania wszystkich poprzednich modyfikacji encji. |
kleszcz | Wywoływany w każdej pętli renderowania lub tiku sceny. Służy do ciągłych zmian lub kontroli. |
grać | Wywoływany za każdym razem, gdy odtwarzana jest scena lub obiekt, aby dodać dowolne tło lub zachowanie dynamiczne. Wywoływany również raz podczas inicjowania komponentu. Służy do uruchamiania lub wznawiania zachowania. |
pauza | Wywoływany za każdym razem, gdy scena lub byt zatrzymuje się w celu usunięcia tła lub zachowania dynamicznego. Wywoływany również, gdy komponent jest usuwany z encji lub gdy encja jest odłączana od sceny. Służy do zatrzymywania zachowania. |
updateSchema | Wywoływany za każdym razem, gdy którakolwiek z właściwości komponentu jest aktualizowana. Może być używany do dynamicznej modyfikacji schematu. |
Właściwości prototypu elementu
W ramach metod, mamy dostęp do prototypu komponentu poprzez this
:
własność | Opis |
---|---|
this.data | Przetwarzane właściwości komponentu obliczone na podstawie domyślnych wartości schematu, miksów i atrybutów encji. |
this.el | Odwołanie do [encji] [encji] jako elementu HTML. |
this.el.sceneEl | Odwołanie do [sceny] [sceny] jako elementu HTML. |
this.id | Jeśli komponent może mieć [wiele instancji] [wiele], identyfikator indywidualnej instancji komponentu (np. foo z sound__foo ). |
METODY
.w tym ()
.init ()
jest wywoływana raz na początku cyklu życia komponentu. Jednostka może wywołać init
obsługi modułu:
- Gdy składnik jest ustawiony statycznie na encję w pliku HTML, a strona jest ładowana.
- Gdy komponent jest ustawiony na dołączonym
setAttribute
za pośrednictwemsetAttribute
. - Gdy komponent jest ustawiony na nieprzyłączonej encji, a następnie jest on dołączany do sceny za pośrednictwem
appendChild
.
Moduł obsługi init
jest często używany do:
- Ustaw stan początkowy i zmienne
- Metody wiązania
- Dołącz detektory zdarzeń
Na przykład init
komponentu kursora ustawia zmienne stanu, metody wiązania i dodaje detektory zdarzeń:
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)
jest wywoływana za każdym razem, gdy zmieniają się właściwości komponentu, w tym na początku cyklu życia komponentu. Jednostka może wywołać update
obsługi update
komponentu:
- Po wywołaniu
init ()
na początku cyklu życia komponentu. - Gdy właściwości komponentu zostaną zaktualizowane za pomocą
.setAttribute
.
Moduł obsługi update
jest często używany do:
- Wykonaj większość pracy przy modyfikowaniu encji, używając
this.data
. - Zmodyfikuj element za każdym razem, gdy zmieni się jedna lub więcej właściwości komponentu.
Szczegółowych modyfikacji encji można dokonać poprzez [różnicowanie] [różnicowanie] bieżącego zestawu danych ( this.data
) z poprzednim this.data
danych przed aktualizacją ( oldData
).
A-Frame wywołuje .update()
zarówno na początku cyklu życia komponentu, jak i za każdym razem, gdy zmieniają się dane komponentu (np. W wyniku setAttribute
). Moduł obsługi aktualizacji często używa this.data
do modyfikowania encji. Moduł obsługi aktualizacji ma dostęp do poprzedniego stanu danych komponentu za pośrednictwem pierwszego argumentu. Możemy użyć poprzednich danych komponentu, aby dokładnie powiedzieć, które właściwości zostały zmienione w celu przeprowadzenia szczegółowych aktualizacji.
Na przykład update
widocznego komponentu ustawia widoczność encji.
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 ()
jest wywoływana za każdym razem, gdy komponent jest odłączany od encji. Jednostka może wywołać remove
obsługi remove
komponentu:
- Gdy składnik zostanie usunięty z obiektu za pomocą
removeAttribute
. - Gdy jednostka zostanie odłączona od sceny (np.
removeChild
).
Moduł obsługi remove
jest często używany do:
- Usuń, cofnij lub wyczyść wszystkie modyfikacje komponentu w encji.
- Odłącz detektory zdarzeń.
Na przykład po usunięciu [komponentu światła] [light] komponent światła usunie obiekt lekki, który wcześniej ustawił na obiekcie, usuwając go ze sceny.
AFRAME.registerComponent('light', {
// ...
remove: function () {
this.el.removeObject3D('light');
}
// ...
});
.tick (czas, czasDelta)
.tick ()
jest wywoływany w każdym tiku lub ramce pętli renderowania sceny. Scena wywoła tick
obsługi tick
komponentu:
- Na każdej ramce pętli renderowania.
- W przedziale od 60 do 120 razy na sekundę.
- Jeśli obiekt lub scena nie jest wstrzymana (np. Inspektor jest otwarty).
- Jeśli jednostka nadal jest dołączona do sceny.
Obsługa tick
jest często używana do:
- W sposób ciągły modyfikuj element w każdej ramce lub w odstępach czasu.
- Sonda dla warunków.
Moduł obsługi tick
zapewnia globalny czas działania sceny w milisekundach ( time
) i różnicę czasu w milisekundach od ostatniej klatki ( timeDelta
). Można ich użyć do interpolacji lub do uruchamiania tylko części modułu obsługi tick
w ustalonym odstępie czasu.
Na przykład śledzony komponent kontrolny będzie rozwijał animacje kontrolera, aktualizował pozycję i obrót kontrolera oraz sprawdzał naciśnięcia przycisków.
AFRAME.registerComponent('tracked-controls', {
// ...
tick: function (time, timeDelta) {
this.updateMeshAnimation();
this.updatePose();
this.updateButtons();
}
// ...
});
.pause ()
.pause ()
jest wywoływana, gdy jednostka lub scena .pause ()
wstrzymane. Jednostka może wywołać pause
obsługi pause
komponentu:
- Przed usunięciem komponentu, przed wywołaniem modułu obsługi
remove
. - Gdy encja jest wstrzymana za pomocą
Entity.pause ()
. - Gdy scena jest wstrzymana za pomocą
Scene.pause ()
(np. Inspektor jest otwarty).
Moduł obsługi pause
jest często używany do:
- Usuń detektory zdarzeń.
- Usuń wszelkie szanse na zachowanie dynamiczne.
Na przykład komponent dźwiękowy wstrzyma dźwięk i usunie detektor zdarzeń, który odtworzyłby dźwięk w przypadku zdarzenia:
AFRAME.registerComponent('sound', {
// ...
pause: function () {
this.pauseSound();
this.removeEventListener();
}
// ...
});
.grać ()
.play ()
jest wywoływana, gdy jednostka lub scena zostaną wznowione. Podmiot może wywołać komponentu play
obsługi:
- Po pierwszym podłączeniu komponentu po wywołaniu modułu obsługi
update
. - Gdy jednostka została wstrzymana, ale następnie wznowiona za pomocą
Entity.play ()
. - Gdy scena została wstrzymana, ale następnie wznowiona za pomocą
Scene.play ()
.
Program obsługi play
jest często używany do:
- Dodaj detektory zdarzeń.
Na przykład komponent dźwiękowy odtworzy dźwięk i zaktualizuje detektor zdarzeń, który odtworzy dźwięk w przypadku zdarzenia:
AFRAME.registerComponent('sound', {
// ...
play: function () {
if (this.data.autoplay) { this.playSound(); }
this.updateEventListener();
}
// ...
});
.updateSchema (dane)
.updateSchema ()
, jeśli jest zdefiniowana, jest wywoływana przy każdej aktualizacji w celu sprawdzenia, czy schemat wymaga dynamicznej modyfikacji.
updateSchema
obsługi updateSchema
jest często używany do:
- Dynamicznie aktualizuj lub rozszerzaj schemat, zwykle w zależności od wartości właściwości.
Na przykład komponent geometrii sprawdza, czy właściwość primitive
uległa zmianie, aby ustalić, czy zaktualizować schemat dla innego typu geometrii:
AFRAME.registerComponent('geometry', {
// ...
updateSchema: (newData) {
if (newData.primitive !== this.data.primitive) {
this.extendSchema(GEOMETRIES[newData.primitive].schema);
}
}
// ...
});
KOMPONENTOWE METODY PROTOTYPOWE
.flushToDOM ()
Aby zaoszczędzić czas procesora podczas tworzenia łańcucha, A-Frame aktualizuje tylko w trybie debugowania serializowaną reprezentację komponentu w rzeczywistym DOM. Wywołanie flushToDOM () spowoduje ręczną serializację danych komponentu i aktualizację DOM:
document.querySelector('[geometry]').components.geometry.flushToDOM();
Zarejestruj niestandardowy komponent A-Frame
AFRAME.registerComponent (nazwa, definicja)
Zarejestruj komponent A-Frame. Musimy zarejestrować komponenty, zanim użyjemy ich w dowolnym miejscu . Oznacza to, że z pliku HTML komponenty powinny być wcześniej uporządkowane .
- {string} name - Nazwa komponentu. Publiczny interfejs API komponentu przedstawiony za pomocą nazwy atrybutu HTML.
- Definicja {Object} - definicja komponentu. Zawiera metody obsługi schematów i procedur obsługi cyklu życia.
Rejestrowanie komponentu w foo w pliku js, np. Foo-component.js
AFRAME.registerComponent('foo', {
schema: {},
init: function () {},
update: function () {},
tick: function () {},
remove: function () {},
pause: function () {},
play: function () {}
});
Wykorzystanie komponentu foo w twojej scenie
<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>
Składnikowy formularz HTML
Komponent przechowuje zestaw danych w postaci jednej lub więcej właściwości komponentu. Komponenty używają tych danych do modyfikowania jednostek. Rozważmy element silnika, możemy zdefiniować właściwości, takie jak moc lub cylindry.
Atrybuty HTML reprezentują nazwy komponentów, a wartość tych atrybutów reprezentuje dane komponentów.
Komponent pojedynczej właściwości
Jeśli składnik jest składnikiem pojedynczej właściwości, co oznacza, że jego dane składają się z pojedynczej wartości, to w HTML wartość składnika wygląda jak normalny atrybut 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 wielu właściwości
Jeśli składnik jest składnikiem o wielu właściwościach, co oznacza, że dane składają się z wielu właściwości i wartości, to w HTML wartość składnika przypomina wbudowane style CSS:
<!-- `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>
Definiowanie obiektu schematu Compnent
Schemat to obiekt, który definiuje i opisuje właściwość lub właściwości komponentu. Klucze schematu to nazwy właściwości, a wartości schematu określają typy i wartości właściwości (w przypadku komponentu zawierającego wiele właściwości):
Definiowanie schematu w komponencie
AFRAME.registerComponent('bar', {
schema: {
color: {default: '#FFF'},
size: {type: 'int', default: 5}
}
}
Zastąp zdefiniowane wartości domyślne schematu
<a-scene>
<a-entity bar="color: red; size: 20"></a-entity>
</a-scene>
Schemat pojedynczej właściwości
Składnik może być składnikiem pojedynczej właściwości (składającym się z jednej anonimowej wartości) lub składnikiem wielu właściwości (składającym się z wielu nazwanych wartości). A-Frame będzie wnioskować, czy komponent jest pojedynczą właściwością czy wieloma właściwościami na podstawie struktury schematu.
Schemat komponentu pojedynczej właściwości zawiera klucze type
i / lub default
, a wartości schematu są zwykłymi wartościami, a nie obiektami:
AFRAME.registerComponent('foo', {
schema: {type: 'int', default: 5}
});
<a-scene>
<a-entity foo="20"></a-entity>
</a-scene>
Typy właściwości komponentu A-Frame
Typy właściwości definiują przede wszystkim sposób, w jaki schemat analizuje przychodzące dane z DOM dla każdej właściwości. Analizowane dane będą wówczas dostępne za pośrednictwem właściwości data
w prototypie komponentu. Poniżej znajdują się wbudowane typy właściwości A-Frame:
Typ nieruchomości | Opis | Domyślna wartość |
---|---|---|
szyk | Analizuje wartości rozdzielone przecinkami do tablicy (tj. "1, 2, 3" to ['1', '2', '3']) . | [] |
kapitał | W przypadku adresów URL wskazujących ogólne zasoby. Może parsować adres URL poza ciąg znaków w postaci adresu url(<url>) . Jeśli wartością jest selektor identyfikatora elementu (np. #texture ), ten typ właściwości wywoła getElementById i getAttribute('src') celu zwrócenia adresu URL. Typ właściwości asset może ulec zmianie lub nie, aby obsługiwać XHR lub zwracać MediaElements bezpośrednio (np. Elementy <img> ). | '' |
audio | Taki sam proces analizowania jak typ właściwości asset . Być może zostanie użyty przez Inspektora A-Frame do prezentacji zasobów audio. | '' |
boolean | Przetwarza ciąg znaków na wartość logiczną (tj. "false" na fałsz, wszystko inne prawda). | fałszywy |
kolor | Obecnie nie wykonuje żadnej analizy. Używany głównie przez Inspektora ramek A do prezentacji próbnika kolorów. Ponadto wymagane jest użycie typu koloru, aby animacje kolorów działały. | #FFF |
int | Wywołuje parseInt (np. "124.5" do 124 ). | 0 |
mapa | Taki sam proces analizowania jak typ właściwości asset . Być może zostanie użyty przez Inspektora A-Frame do prezentacji zasobów tekstur. | '' |
Model | Taki sam proces analizowania jak typ właściwości asset . Prawdopodobnie zostanie użyty przez Inspektora A-Frame do prezentacji zasobów modelu. | '' |
numer | Wywołuje parseFloat (np. '124.5' do '124.5' ). | 0 |
selektor | Wywołuje querySelector (np. "#box" na <a-entity id="box"> ). | zero |
selektorWszystkie | Wywołuje querySelectorAll i konwertuje NodeList na Array (np. ".boxes" na [<a-entity class = „box”, ...]), | zero |
strunowy | Nie wykonuje żadnej analizy. | '' |
vec2 | Analizuje dwie liczby w obiekt {x, y} (np. 1 -2 do {x: 1, y: -2} . | {x: 0, y: 0} |
vec3 | Analizuje trzy liczby w obiekt {x, y, z} (np. 1 -2 3 do {x: 1, y: -2, z: 3} . | {x: 0, y: 0, z: 0} |
vec4 | Analizuje cztery liczby w obiekt {x, y, z, w} (np. 1 -2 3 -4.5 do {x: 1, y: -2, z: 3, w: -4.5} . | {x: 0, y: 0, z: 0, w: 0} |
Schemat spróbuje wywnioskować typ właściwości, podając tylko wartość domyślną:
schema: {default: 10} // type: "number"
schema: {default: "foo"} // type: "string"
schema: {default: [1, 2, 3]} // type: "array"
Schemat ustawi wartość domyślną, jeśli nie zostanie podana, biorąc pod uwagę typ właściwości:
schema: {type: 'number'} // default: 0
schema: {type: 'string'} // default: ''
schema: {type: 'vec3'} // default: {x: 0, y: 0, z: 0}
Typ właściwości niestandardowej Możemy również zdefiniować własny typ właściwości lub parser, udostępniając funkcję parse
zamiast 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('/');
}
}
}
Dostęp do elementów i metod komponentu
Do elementów i metod komponentu można uzyskać dostęp poprzez encję z obiektu .components . Wyszukaj komponent z mapy komponentów encji, a my będziemy mieli dostęp do jego wewnętrznych elementów. Rozważ ten przykładowy komponent:
AFRAME.registerComponent('foo', {
init: function () {
this.bar = 'baz';
},
qux: function () {
// ...
}
});
Przejdźmy do elementu pręta i metody qux :
var fooComponent = document.querySelector('[foo]').components.foo;
console.log(fooComponent.bar);
fooComponent.qux();