Suche…


Einführung

A-Frame repräsentiert eine Entität über das Element <a-entity> . Wie im Entitäts-Komponentensystem-Muster definiert, sind Entitäten Platzhalterobjekte, in die Komponenten eingefügt werden, um ihnen Aussehen, Verhalten und Funktionalität zu bieten.

Syntax

  • <a-entity> // Consider the entity below. By itself, it has no appearance, behavior, or functionality. It does nothing:
  • <a-entity geometry="primitive: box" material="color: red"> // We can attach components to it to make it render something or do something. To give it shape and appearance, we can attach the geometry and material components:
  • <a-entity geometry="primitive: box" material="color: red" light="type: point; intensity: 2.0"> // Or to make it emit light, we can further attach the light component:

Parameter

Parameter Einzelheiten
Komponenten <a-entity>.components ist ein Objekt, das mit der Entität verbunden ist. Dies gibt uns Zugriff auf die Komponenten der Entität, einschließlich Daten, Status und Methoden jeder Komponente.
spielt Ob die Entität aktiv ist und spielt. Wenn wir die Entität pausieren, wird isPlaying false.
object3D <a-entity>.object3D ist eine Referenz auf die Object.D-Darstellung von drei.js der Entität. Insbesondere ist object3D ein THREE.Group Objekt, das verschiedene Typen von THREE.Object3D enthalten kann, z. B. Kameras, Netze, Lichter oder Sounds:
object3DMap Die object3DMap eines Objekts ist ein Objekt, das Zugriff auf die verschiedenen Typen von THREE.Object3Ds (z. B. Kamera, Maschen, Lichter, Töne) bietet, die von Komponenten festgelegt wurden.
sceneEl Eine Entität hat eine Referenz auf ihr Szenenelement.

Bemerkungen

Methoden


addState (stateName)

addState überträgt einen Zustand auf die Entität. Dadurch wird das stateadded- Ereignis ausgegeben , und wir können den Status mit .is auf Existenz überprüfen:

entity.addEventListener('stateadded', function (evt) {
  if (evt.detail.state === 'selected') {
    console.log('Entity now selected!');
  }
});
entity.addState('selected');
entity.is('selected');  // >> true

emittieren (Name, Detail, Blasen)

emit gibt ein benutzerdefiniertes DOM-Ereignis für die Entität aus. Zum Beispiel können wir ein Ereignis ausgeben, um eine Animation auszulösen:

<a-entity>
  <a-animation attribute="rotation" begin="rotate" to="0 360 0"></a-animation>
</a-entity>
entity.emit('rotate');

Wir können auch Ereignisdetails oder Daten als zweites Argument übergeben:

entity.emit('collide', { target: collidingEntity });

Das Ereignis wird standardmäßig angezeigt. Wir können sagen, dass es nicht blubbern soll, indem Sie false für bubble übergeben:

entity.emit('sink', null, false);

flushToDOM (rekursiv)

flushToDOM serialisiert die Daten einer Entität manuell und aktualisiert das DOM.


getAttribute (Komponentenname)

getAttribute ruft geparste Komponentendaten (einschließlich Mixins und Standardwerte) ab.

// <a-entity geometry="primitive: box; width: 3">
entity.getAttribute('geometry');
// >> {primitive: "box", depth: 2, height: 2, translate: "0 0 0", width: 3, ...}
entity.getAttribute('geometry').primitive;
// >> "box"
entity.getAttribute('geometry').height;
// >> 2
entity.getAttribute('position');
// >> {x: 0, y: 0, z: 0}

Wenn Komponentenname nicht der Name einer registrierten Komponente ist, verhält sich getAttribute wie gewöhnlich:

// <a-entity data-position="0 1 1">
entity.getAttribute('data-position');
// >> "0 1 1"

getDOMAttribute (Komponentenname)

getDOMAttribute ruft nur geparste Komponentendaten ab, die explizit im DOM oder über setAttribute definiert sind . Wenn Komponentenname der Name einer registrierten Komponente ist, gibt getDOMAttribute nur die im HTML definierten Komponentendaten als geparstes Objekt zurück. getDOMAttribute für Komponenten ist die Teilform von getAttribute, da die zurückgegebenen Komponentendaten keine angewendeten Mixins oder Standardwerte enthalten:

Vergleichen Sie die Ausgabe des obigen Beispiels für getAttribute :

// <a-entity geometry="primitive: box; width: 3">
entity.getDOMAttribute('geometry');
// >> { primitive: "box", width: 3 }
entity.getDOMAttribute('geometry').primitive;
// >> "box"
entity.getDOMAttribute('geometry').height;
// >> undefined
entity.getDOMAttribute('position');
// >> undefined

getObject3D (Typ)

getObject3D sucht ein untergeordnetes THREE.Object3D, auf das in object3DMap vom Typ verwiesen wird .

AFRAME.registerComponent('example-mesh', {
  init: function () {
     var el = this.el;
     el.getOrCreateObject3D('mesh', THREE.Mesh);
     el.getObject3D('mesh');  // Returns THREE.Mesh that was just created.
  }
});

getOrCreateObject3D (Typ, Konstruktor)

Wenn für die Entität kein THREE.Object3D unter type registriert ist, registriert getOrCreateObject3D ein instantiiertes THREE.Object3D mit dem übergebenen Konstruktor . Wenn für die Entität ein THREE.Object3D- Typ unter Typ registriert ist, fungiert getOrCreateObject3D als getObject3D :

AFRAME.registerComponent('example-geometry', {
  update: function () {
    var mesh = this.el.getOrCreateObject3D('mesh', THREE.Mesh);
    mesh.geometry = new THREE.Geometry();
  }
});

Pause ()

pause () stoppt dynamisches Verhalten, wie es von Animationen und Komponenten definiert wird. Wenn wir eine Entität unterbrechen, stoppt sie ihre Animationen und ruft Component.pause () für jede ihrer Komponenten auf. Die Komponenten entscheiden sich für die Implementierung des Pausenverhaltens, wodurch häufig Ereignis-Listener entfernt werden. Eine Entität ruft pause () für ihre untergeordneten Entitäten auf, wenn eine Entität angehalten wird.

// <a-entity id="spinning-jumping-ball">
entity.pause();

Beispielsweise entfernt die Look-Control-Komponente bei Pause Ereignis-Handler, die auf Eingaben warten.


abspielen ()

play () startet jedes dynamische Verhalten, das durch Animationen und Komponenten definiert wird. Dies wird automatisch aufgerufen, wenn das DOM eine Entität anfügt. Wenn eine Entität play () startet, ruft die Entity play () für ihre untergeordneten Entitäten auf.

entity.pause();
entity.play();

Zum Beispiel beginnt die Soundkomponente beim Abspielen des Sounds.


setAttribute (Komponentenname, Wert, [Eigenschaftswert | Clobber])

Wenn Komponentenname nicht der Name einer registrierten Komponente ist oder die Komponente eine Komponente mit einer einzigen Eigenschaft ist, verhält sich setAttribute wie folgt :

entity.setAttribute('visible', false);

Wenn Komponentenname der Name einer registrierten Komponente ist, kann sie die spezielle Analyse für den Wert verarbeiten. Die Positionskomponente ist beispielsweise eine Komponente mit einer einzigen Eigenschaft, ihr Parser für Eigenschaftstyp ermöglicht jedoch die Übernahme eines Objekts:

entity.setAttribute('position', { x: 1, y: 2, z: 3 });

setObject3D (Typ, Objekt)

setObject3D registriert das übergebene Objekt , ein THREE.Object3D , als type unter der object3DMap der Entität. A-Frame fügt obj als untergeordnetes Objekt des Entity- Objekts object3D hinzu .

AFRAME.registerComponent('example-orthogonal-camera', {
  update: function () {
    this.el.setObject3D('camera', new THREE.OrthogonalCamera());
  }
});

removeAttribute (Komponentenname, Eigenschaftsname)

Wenn Komponentenname der Name einer registrierten Komponente ist und das Attribut aus dem DOM entfernt wird, trennt removeAttribute auch die Komponente von der Entität und ruft die Entfernungszyklusmethode der Komponente auf.

entity.removeAttribute('goemetry');  // Detach the geometry component.
entity.removeAttribute('sound');  // Detach the sound component.

Wenn propertyName angegeben ist, setzt removeAttribute den Eigenschaftswert der von propertyName angegebenen Eigenschaft auf den Standardwert der Eigenschaft zurück:

entity.setAttribute('material', 'color', 'blue');  // The color is blue.
entity.removeAttribute('material', 'color');  // Reset the color to the default value, white.

removeObject3D (Typ)

removeObject3D entfernt das durch type angegebene Objekt aus der THREE.Group der Entität und somit aus der Szene. Dadurch wird object3DMap der Entität aktualisiert und der Wert des Typenschlüssels auf null gesetzt . Dies wird im Allgemeinen von einer Komponente aus aufgerufen, häufig im Remove-Handler:

AFRAME.registerComponent('example-light', {
  update: function () {
    this.el.setObject3D('light', new THREE.Light());
    // Light is now part of the scene.
    // object3DMap.light is now a THREE.Light() object.
  },
  remove: function () {
    this.el.removeObject3D('light');
    // Light is now removed from the scene.
    // object3DMap.light is now null.
  }
});

removeState (stateName)

removeState zeigt einen Zustand aus der Entität an. Dadurch wird das stateremoved -Ereignis ausgegeben , und wir können den Status des Entfernens mit .is überprüfen:

entity.addEventListener('stateremoved', function (evt) {
  if (evt.detail.state === 'selected') {
    console.log('Entity no longer selected.');
  }
});
entity.addState('selected');
entity.is('selected');  // >> true
entity.removeState('selected');
entity.is('selected');  // >> false

VERANSTALTUNGEN

Veranstaltungsname Beschreibung
mit Kindern verbunden Eine untergeordnete Entität wurde an die Entität angehängt.
Kinderhaus Eine untergeordnete Entität wurde von der Entität getrennt.
Komponente geändert Eine der Komponenten der Entität wurde geändert.
Komponenteinit Eine Komponente des Unternehmens wurde initialisiert.
Komponententfernt Eine Komponente der Entität wurde entfernt.
geladen Das Unternehmen hat seine Komponenten angehängt und initialisiert.
object3dset THREE.Object3D wurde mit setObject3D (Name) für die Entität festgelegt. Ereignisdetails enthalten den Namen, der zur Einstellung in object3DMap verwendet wird.
Pause Die Entität ist jetzt inaktiv und pausiert in Bezug auf dynamisches Verhalten.
abspielen Die Entität ist jetzt aktiv und spielt in Bezug auf dynamisches Verhalten.
Stateadded Die Entität erhielt einen neuen Staat.
stateremoved Die Entität hat keinen bestimmten Zustand mehr.
Schema geändert Das Schema einer Komponente wurde geändert.

VERANSTALTUNGSDETAILS

Nachfolgend finden Sie die Details zu den einzelnen Ereignissen:

Veranstaltungsname Eigentum Beschreibung
mit Kindern verbunden el Verweis auf das angefügte untergeordnete Element.
Komponente geändert Name Name der Komponente, deren Daten geändert wurden.
Ich würde ID der Komponente, deren Daten geändert wurden.
neue Daten Neue Daten der Komponente, nachdem sie geändert wurden.
alteDaten Vorherige Daten der Komponente, bevor sie geändert wurden.
Komponenteinitialisiert Name Name der Komponente, die initialisiert wurde.
Ich würde ID der Komponente, deren Daten geändert wurden.
Daten Komponentendaten.
Komponententfernt Name Name der Komponente, die entfernt wurde.
Ich würde ID der Komponente, die entfernt wurde.
Stateadded Zustand Der angehängte Zustand (String).
stateremoved Zustand Der Zustand, der getrennt wurde (Zeichenfolge).
Schema geändert Komponente Name der Komponente, deren Schema geändert wurde.

Auf Komponentenänderungen warten

Wir können das Ereignis " componentchanged" verwenden , um Änderungen an der Entität zu überwachen:

entity.addEventListener('componentchanged', function (evt) {
  if (evt.detail.name === 'position') {
    console.log('Entity has moved from', 
      evt.detail.oldData, 'to', evt.detail.newData, '!');
  }
});

Auf untergeordnete Elemente warten, die angefügt und getrennt werden

Wir können die Child-Attached - Ereignisse und Child-Detached- Ereignisse verwenden, um zu überwachen, wann die Szene eine Entität anfügt oder entfernt:

entity.addEventListener('child-attached', function (evt) {
  if (evt.detail.el.tagName.toLowerCase() === 'a-box') {
    console.log('a box element has been attached');
  };
});

Daten der Entität mit mehreren Eigenschaften (setAttribute)

Aktualisieren von Komponentendaten für mehrere Eigenschaften

Um Komponentendaten für eine Komponente mit mehreren Eigenschaften zu aktualisieren, können wir den Namen einer registrierten Komponente als Komponentenname und ein Objekt mit Eigenschaften als Wert übergeben . Eine Zeichenfolge ist ebenfalls zulässig (z. B. type: spot; distance: 30 ), aber Objekte sparen A-Frame etwas Arbeit beim Parsen:

// Only the properties passed in the object will be overwritten.
entity.setAttribute('light', {
  type: 'spot',
  distance: 30,
  intensity: 2.0
});

Um einzelne Eigenschaften für eine Komponente mit mehreren Eigenschaften zu aktualisieren, können Sie den Namen der registrierten Komponente als Komponentenname , einen Eigenschaftennamen als zweites Argument und den Eigenschaftswert als drittes Argument übergeben:

// All previous properties for the material component (besides the color)  will be unaffected.
entity.setAttribute('material', 'color', 'crimson');

Beachten Sie, dass sich Array-Eigenschaftstypen eindeutig verhalten:

  • Arrays sind veränderbar. Sie werden per Referenz zugewiesen, sodass Änderungen an Arrays für die Komponente sichtbar sind.
  • Aktualisierungen der Eigenschaften des Array-Typs lösen weder die Aktualisierungsmethode der Komponente aus, noch werden Ereignisse ausgelöst.

Aktualisieren von Komponentendaten für mehrere Eigenschaften

Wenn true als drittes Argument an .setAttribute übergeben wird , werden nicht angegebene Eigenschaften zurückgesetzt und gesäubert:

// All previous properties for the light component will be removed and overwritten.
entity.setAttribute('light', {
  type: 'spot',
  distance: 30,
  intensity: 2.0
}, true);

Entität abrufen

Wir können eine Entität einfach mithilfe von DOM-APIs abrufen.

<a-entity id="mario"></a-entity>
var el = document.querySelector('#mario');

Entitätskomponenten abrufen

Wenn wir beispielsweise das Three.js-Kameraobjekt oder das Materialobjekt einer Entität packen wollten, könnten wir in ihre Komponenten greifen

var camera = document.querySelector('a-entity[camera]').components.camera.camera;
var material = document.querySelector('a-entity[material]').components.material.material;

Wenn eine Komponente eine API verfügbar macht, können wir ihre Methoden aufrufen:

document.querySelector('a-entity[sound]').components.sound.pause();


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow