aframe
Entitäten
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();