aframe
Entidades
Buscar..
Introducción
A-Frame representa una entidad a través del elemento <a-entity>
. Como se define en el patrón entidad-componente-sistema, las entidades son objetos de marcador de posición a los que conectamos componentes para proporcionarles apariencia, comportamiento y funcionalidad.
Sintaxis
-
<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:
Parámetros
Parámetro | Detalles |
---|---|
componentes | <a-entity>.components es un objeto de componentes adjuntos a la entidad. Esto nos da acceso a los componentes de la entidad, incluidos los datos, el estado y los métodos de cada componente. |
está jugando | Si la entidad está activa y jugando. Si pausamos la entidad, entonces la reproducción se vuelve falsa. |
object3D | <a-entity>.object3D es una referencia a la representación de tres.js Object3D de la entidad. Más específicamente, object3D será un objeto de THREE.Group que puede contener diferentes tipos de THREE.Object3D como cámaras, mallas, luces o sonidos: |
object3DMap | El object3DMap de una entidad es un objeto que da acceso a los diferentes tipos de THREE.Object3Ds (por ejemplo, cámara, mallas, luces, sonidos) que los componentes han establecido. |
escenaEl | Una entidad tiene una referencia a su elemento de escena. |
Observaciones
Metodos
addState (stateName)
addState empujará un estado en la entidad. Esta emitirá el evento stateadded, y podemos comprobar el estado de lata su existencia utilizando .is:
entity.addEventListener('stateadded', function (evt) {
if (evt.detail.state === 'selected') {
console.log('Entity now selected!');
}
});
entity.addState('selected');
entity.is('selected'); // >> true
emitir (nombre, detalle, burbujas)
emit emite un evento DOM personalizado en la entidad. Por ejemplo, podemos emitir un evento para activar una animación:
<a-entity>
<a-animation attribute="rotation" begin="rotate" to="0 360 0"></a-animation>
</a-entity>
entity.emit('rotate');
También podemos pasar detalles del evento o datos como segundo argumento:
entity.emit('collide', { target: collidingEntity });
El evento burbujeará por defecto. Podemos decirle que no burbujee pasando falso por burbuja:
entity.emit('sink', null, false);
flushToDOM (recursivo)
flushToDOM serializará manualmente los datos de los componentes de una entidad y actualizará el DOM.
getAttribute (componentName)
getAttribute recupera datos de componentes analizados (incluidos mixins y valores predeterminados).
// <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}
Si componentName no es el nombre de un componente registrado, getAttribute se comportará como lo haría normalmente:
// <a-entity data-position="0 1 1">
entity.getAttribute('data-position');
// >> "0 1 1"
getDOMAttribute (componentName)
getDOMAttribute recupera solo los datos de componentes analizados que están definidos explícitamente en el DOM o mediante setAttribute . Si componentName es el nombre de un componente registrado, getDOMAttribute devolverá solo los datos del componente definidos en el HTML como un objeto analizado. getDOMAttribute para componentes es la forma parcial de getAttribute ya que los datos de componentes devueltos no incluyen mixins aplicados o valores predeterminados:
Compare la salida del ejemplo anterior de 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 (tipo)
getObject3D busca un hijo TRES. Objeto 3D referenciado por tipo en object3DMap .
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 (tipo, Constructor)
Si la entidad no tiene un THREE.Object3D registrado en el tipo , getOrCreateObject3D registrará un THREE.Object3D instanciado utilizando el Constructor pasado. Si la entidad tiene un THREE.Object3D registrado en tipo , getOrCreateObject3D actuará como getObject3D :
AFRAME.registerComponent('example-geometry', {
update: function () {
var mesh = this.el.getOrCreateObject3D('mesh', THREE.Mesh);
mesh.geometry = new THREE.Geometry();
}
});
pausa ()
pause () detendrá cualquier comportamiento dinámico definido por animaciones y componentes. Cuando pausamos una entidad, detendrá sus animaciones y llamará a Component.pause () en cada uno de sus componentes. Los componentes deciden implementar lo que sucede en la pausa, que a menudo es eliminar los escuchas de eventos. Una entidad llamará a pausa () en sus entidades secundarias cuando pausemos una entidad.
// <a-entity id="spinning-jumping-ball">
entity.pause();
Por ejemplo, el componente look-controls on pause eliminará los controladores de eventos que escuchan las entradas.
jugar ()
play () iniciará cualquier comportamiento dinámico definido por animaciones y componentes. Esto se llama automáticamente cuando el DOM adjunta una entidad. Cuando una entidad juega () , la entidad llama a play () en sus entidades secundarias.
entity.pause();
entity.play();
Por ejemplo, el componente de sonido en la reproducción comenzará a reproducir el sonido.
setAttribute (componentName, value, [propertyValue | clobber])
Si componentName no es el nombre de un componente registrado o si el componente es un componente de una sola propiedad, setAttribute se comporta como lo haría normalmente:
entity.setAttribute('visible', false);
Aunque si componentName es el nombre de un componente registrado, puede manejar un análisis especial para el valor. Por ejemplo, el componente de posición es un componente de una sola propiedad, pero su analizador de tipo de propiedad le permite tomar un objeto:
entity.setAttribute('position', { x: 1, y: 2, z: 3 });
setObject3D (tipo, obj)
setObject3D registrará el obj pasado, un THREE.Object3D , como tipo debajo del object3DMap de la entidad. A-Frame agrega obj como hijo del objeto raíz3D de la entidad.
AFRAME.registerComponent('example-orthogonal-camera', {
update: function () {
this.el.setObject3D('camera', new THREE.OrthogonalCamera());
}
});
removeAttribute (componentName, propertyName)
Si componentName es el nombre de un componente registrado, junto con la eliminación del atributo del DOM, removeAttribute también separará el componente de la entidad, invocando el método de eliminación del ciclo de vida del componente.
entity.removeAttribute('goemetry'); // Detach the geometry component.
entity.removeAttribute('sound'); // Detach the sound component.
Si se proporciona propertyName , removeAttribute restablecerá el valor de propiedad de esa propiedad especificada por propertyName al valor predeterminado de la propiedad:
entity.setAttribute('material', 'color', 'blue'); // The color is blue.
entity.removeAttribute('material', 'color'); // Reset the color to the default value, white.
removeObject3D (tipo)
removeObject3D elimina el objeto especificado por tipo de THREE.Group de la entidad y, por lo tanto, de la escena. Esto actualizará el object3DMap de la entidad, estableciendo el valor de la clave de tipo en nulo . Esto generalmente se llama desde un componente, a menudo dentro del controlador de eliminación:
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 sacará un estado de la entidad. Esto emitirá el evento stateremoved , y podemos verificar el estado de su eliminación mediante .is :
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
EVENTOS
Nombre del evento | Descripción |
---|---|
adjunto al niño | Una entidad hijo se adjuntó a la entidad. |
separado del niño | Una entidad hijo fue separada de la entidad. |
componente cambiado | Uno de los componentes de la entidad fue modificado. |
componenteinit | Uno de los componentes de la entidad fue inicializado. |
componerse | Uno de los componentes de la entidad fue eliminado. |
cargado | La entidad ha adjuntado e inicializado sus componentes. |
object3dset | THREE.Object3D se configuró en la entidad usando setObject3D (nombre). El detalle del evento contendrá el nombre utilizado para establecer en el object3DMap. |
pausa | La entidad ahora está inactiva y en pausa en términos de comportamiento dinámico. |
jugar | La entidad ahora está activa y jugando en términos de comportamiento dinámico. |
declarado | La entidad recibió un nuevo estado. |
stateremoved | La entidad ya no tiene un cierto estado. |
esquema cambiado | Se cambió el esquema de un componente. |
DETALLES DEL EVENTO
A continuación se muestra lo que contiene el detalle del evento para cada evento:
Nombre del evento | Propiedad | Descripción |
---|---|---|
adjunto al niño | el | Referencia al elemento hijo adjunto. |
componente cambiado | nombre | Nombre del componente que tuvo sus datos modificados. |
carné de identidad | ID del componente que tuvo sus datos modificados. | |
nuevos datos | Nuevos datos del componente, luego de su modificación. | |
Datos antiguos | Datos anteriores del componente, antes de su modificación. | |
componente inicializado | nombre | Nombre del componente que se inicializó. |
carné de identidad | ID del componente que tuvo sus datos modificados. | |
datos | Datos del componente. | |
componerse | nombre | Nombre del componente que fue eliminado. |
carné de identidad | ID del componente que se eliminó. | |
declarado | estado | El estado que se adjuntó (cadena). |
stateremoved | estado | El estado que fue separado (cadena). |
esquema cambiado | componente | Nombre del componente que tuvo su esquema cambiado. |
Escuchar los cambios de componentes
Podemos usar el evento de cambio de componente para escuchar los cambios en la entidad:
entity.addEventListener('componentchanged', function (evt) {
if (evt.detail.name === 'position') {
console.log('Entity has moved from',
evt.detail.oldData, 'to', evt.detail.newData, '!');
}
});
Escuchando los elementos del niño que están unidos y separados
Podemos usar los eventos adjuntos y separados del niño para escuchar cuando la escena adjunta o separa una entidad:
entity.addEventListener('child-attached', function (evt) {
if (evt.detail.el.tagName.toLowerCase() === 'a-box') {
console.log('a box element has been attached');
};
});
Datos de componentes de múltiples propiedades de la entidad (setAttribute)
Actualización de datos de componentes de propiedades múltiples
Para actualizar los datos del componente para un componente de múltiples propiedades, podemos pasar el nombre de un componente registrado como el nombre de componente , y pasar un objeto de propiedades como el valor . Una cadena también es aceptable (p. Ej., Escriba: punto; distancia: 30 ), pero los objetos guardarán A-Frame en algunos trabajos de análisis:
// Only the properties passed in the object will be overwritten.
entity.setAttribute('light', {
type: 'spot',
distance: 30,
intensity: 2.0
});
O para actualizar propiedades individuales para un componente de múltiples propiedades, podemos pasar el nombre del componente registrado como el nombre de componente , un nombre de propiedad como el segundo argumento y el valor de la propiedad para establecer como el tercer argumento:
// All previous properties for the material component (besides the color) will be unaffected.
entity.setAttribute('material', 'color', 'crimson');
Tenga en cuenta que los tipos de propiedad de matriz se comportan de forma única:
- Las matrices son mutables. Se asignan por referencia para que los cambios en las matrices sean visibles por el componente.
- Las actualizaciones de las propiedades de tipo de matriz no activarán el método de actualización del componente ni emitirán eventos.
Actualización de datos de componentes de propiedades múltiples
Si se pasa verdadero como tercer argumento a .setAttribute , las propiedades no especificadas se restablecerán y se borrarán:
// All previous properties for the light component will be removed and overwritten.
entity.setAttribute('light', {
type: 'spot',
distance: 30,
intensity: 2.0
}, true);
Recuperando una Entidad
Simplemente podemos recuperar una entidad utilizando las API de DOM.
<a-entity id="mario"></a-entity>
var el = document.querySelector('#mario');
Recuperando componentes de una entidad
Por ejemplo, si quisiéramos agarrar el objeto de cámara u objeto material de una entidad de tres.js, podríamos llegar a sus componentes
var camera = document.querySelector('a-entity[camera]').components.camera.camera;
var material = document.querySelector('a-entity[material]').components.material.material;
O si un componente expone una API, podemos llamar a sus métodos:
document.querySelector('a-entity[sound]').components.sound.pause();