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średnictwem setAttribute .
  • 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}
Wnioskowanie o typie nieruchomości

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow