aframe
enheter
Sök…
Introduktion
A-Frame representerar en enhet via elementet <a-entity>
. Som definieras i enhetens komponent-systemmönster är enheter platshållareobjekt till vilka vi ansluter komponenter för att ge dem utseende, beteende och funktionalitet.
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:
parametrar
Parameter | detaljer |
---|---|
komponenter | <a-entity>.components är ett objekt för komponenter som är kopplade till enheten. Detta ger oss tillgång till enhetens komponenter inklusive varje komponents data, tillstånd och metoder. |
spelar | Huruvida enheten är aktiv och spelar. Om vi pausar enheten blir isPlaying falskt. |
object3D | <a-entity>.object3D är en hänvisning till enhetens three.js Object3D-representation. Mer specifikt kommer object3D att vara ett THREE.Group som kan innehålla olika typer av THREE.Object3D som kameror, nät, ljus eller ljud: |
object3DMap | En enhets objekt3DMap är ett objekt som ger tillgång till de olika typerna av TRE. Objekt3D: er (t.ex. kamera, nät, ljus, ljud) som komponenterna har ställt in. |
sceneEl | En enhet har en referens till sitt scenelement. |
Anmärkningar
METODER
addState (stateName)
addState kommer att pressa ett tillstånd till enheten. Detta kommer att avge den stateadded händelsen, och vi kan kontrollera tillståndet kan existera med .is :
entity.addEventListener('stateadded', function (evt) {
if (evt.detail.state === 'selected') {
console.log('Entity now selected!');
}
});
entity.addState('selected');
entity.is('selected'); // >> true
avge (namn, detalj, bubblor)
emit avger en anpassad DOM-händelse på enheten. Vi kan till exempel avge en händelse för att utlösa en animation:
<a-entity>
<a-animation attribute="rotation" begin="rotate" to="0 360 0"></a-animation>
</a-entity>
entity.emit('rotate');
Vi kan också skicka händelsedetaljer eller data som det andra argumentet:
entity.emit('collide', { target: collidingEntity });
Händelsen bubblar som standard. vi kan säga det att inte bubbla genom att lämna falskt för bubblan:
entity.emit('sink', null, false);
flushToDOM (rekursiv)
flushToDOM kommer att manuellt serialisera ett enhets komponenter och uppdatera DOM.
getAttribute (komponentnamn)
getAttribute hämtar analyserad komponentdata (inklusive mixins och standardinställningar).
// <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}
Om komponentnamn inte är namnet på en registrerad komponent, kommer getAttribute att fungera som normalt:
// <a-entity data-position="0 1 1">
entity.getAttribute('data-position');
// >> "0 1 1"
getDOMAttribute (komponentnamn)
getDOMAttribute hämtar endast parsad komponentdata som uttryckligen definieras i DOM eller via setAttribute . Om komponentnamn är namnet på en registrerad komponent kommer getDOMAttribute endast att returnera de komponentdata som definierats i HTML som ett analyserat objekt. getDOMAttribute för komponenter är den partiella formen av getAttribute eftersom de returnerade komponentdata inte innehåller tillämpade mixins eller standardvärden:
Jämför utgången från ovanstående exempel på 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 letar upp ett barn TRE.Object3D hänvisat till typ på 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 (typ, konstruktör)
Om företaget inte har en THREE.Object3D registreras enligt typen kommer getOrCreateObject3D registrera ett instansieras THREE.Object3D använder passerade Constructor. Om företaget har en THREE.Object3D registrerad under typ kommer getOrCreateObject3D att fungera som getObject3D :
AFRAME.registerComponent('example-geometry', {
update: function () {
var mesh = this.el.getOrCreateObject3D('mesh', THREE.Mesh);
mesh.geometry = new THREE.Geometry();
}
});
paus ()
paus () stoppar alla dynamiska beteenden som definieras av animationer och komponenter. När vi pausar en enhet kommer den att stoppa dess animationer och ringa Component.pause () på var och en av dess komponenter. Komponenterna bestämmer sig för att implementera vad som händer vid paus, vilket ofta avlägsnar händelserna. En enhet kommer att ringa paus () på sina barnenheter när vi pausar en enhet.
// <a-entity id="spinning-jumping-ball">
entity.pause();
Exempelvis tar look-control-komponenten vid paus bort händelseshanterare som lyssnar efter inmatning.
spela ()
play () startar alla dynamiska beteenden som definieras av animationer och komponenter. Detta anropas automatiskt när DOM kopplar en enhet. När en enhet spelar () , kallar enheten spel () på sina barnenheter.
entity.pause();
entity.play();
Till exempel börjar ljudkomponenten på uppspelningen spela ljudet.
setAttribute (komponentnamn, värde, [propertyValue | clobber])
Om komponentnamn inte är namnet på en registrerad komponent eller om komponenten är en komponent med en egenskap, uppträder setAttribute som det normalt skulle göra:
entity.setAttribute('visible', false);
Även om komponentnamn är namnet på en registrerad komponent, kan den hantera speciell parsing för värdet. Till exempel är positionskomponenten en komponent med en egenskap, men dess parsert för egenskapstyp tillåter den att ta ett objekt:
entity.setAttribute('position', { x: 1, y: 2, z: 3 });
setObject3D (typ, obj)
setObject3D kommer att registrera den godkända obj , en THREE.Object3D , som typ under enhetens objekt3DMap . A-Frame lägger till obj som ett barn av företagets rotobjekt3D .
AFRAME.registerComponent('example-orthogonal-camera', {
update: function () {
this.el.setObject3D('camera', new THREE.OrthogonalCamera());
}
});
removeAttribute (componentName, propertyName)
Om componentName är namnet på en registrerad komponent, tillsammans med att ta bort attributet från DOM, kommer removeAttribute också att ta bort komponenten från enheten och åberopa komponentens metod för att ta bort livscykel.
entity.removeAttribute('goemetry'); // Detach the geometry component.
entity.removeAttribute('sound'); // Detach the sound component.
Om egenskapsnamn anges återställer removeAttribute egenskapsvärdet för den egenskap som specificeras av egenskapsnamn till egenskapens standardvärde:
entity.setAttribute('material', 'color', 'blue'); // The color is blue.
entity.removeAttribute('material', 'color'); // Reset the color to the default value, white.
removeObject3D (typ)
removeObject3D tar bort objektet som anges efter typ från enhetens THREE.Group och därmed från scenen. Detta kommer att uppdatera företagets object3DMap, sätta värdet på nyckeln typ noll. Detta kallas vanligtvis från en komponent, ofta inom borttagningshanteraren:
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 kommer att visa ett tillstånd från enheten. Detta kommer att avge den stateremovedhändelsen , och vi kan kontrollera tillståndet för att det tas bort med .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
EVENEMANG
Event namn | Beskrivning |
---|---|
barnlösa | En barnenhet var kopplad till enheten. |
barn-detached | En barnenhet kopplades bort från enheten. |
componentchanged | En av enhetens komponenter modifierades. |
componentinit | En av enhetens komponenter initialiserades. |
componentremoved | En av enhetens komponenter togs bort. |
lastad | Företaget har kopplat och initialiserat sina komponenter. |
object3dset | THREE.Object3D inställdes på enheten med setObject3D (namn). Eventdetaljer kommer att innehålla namn som används för att ställa in på object3DMap. |
paus | Enheten är nu inaktiv och pausad när det gäller dynamiskt beteende. |
spela | Enheten är nu aktiv och spelar när det gäller dynamiskt beteende. |
stateadded | Enheten fick ett nytt tillstånd. |
stateremoved | Enheten har inte längre ett visst tillstånd. |
schemachanged | Schemat för en komponent ändrades. |
EVENEMANGSDETALJER
Nedan följer vad händelsesdetaljer innehåller för varje evenemang:
Event namn | Fast egendom | Beskrivning |
---|---|---|
barnlösa | el | Hänvisning till det bifogade barnelementet. |
componentchanged | namn | Namnet på komponenten som hade dess data ändrats. |
id | ID för komponenten som hade dess data modifierad. | |
NewData | Komponentens nya data, efter att de har ändrats. | |
OldData | Komponentens tidigare data, innan de ändrades. | |
componentinitialized | namn | Namnet på komponenten som initierades. |
id | ID för komponenten som hade dess data modifierad. | |
data | Komponentdata. | |
componentremoved | namn | Namnet på komponenten som togs bort. |
id | ID för komponent som togs bort. | |
stateadded | stat | Tillståndet som var bifogat (sträng). |
stateremoved | stat | Tillståndet som lossades (sträng). |
schemachanged | komponent | Namnet på komponenten som hade sitt schema har ändrats. |
Lyssna på komponentändringar
Vi kan använda den komponentväxlade händelsen för att lyssna på förändringar i enheten:
entity.addEventListener('componentchanged', function (evt) {
if (evt.detail.name === 'position') {
console.log('Entity has moved from',
evt.detail.oldData, 'to', evt.detail.newData, '!');
}
});
Lyssna på barnelement som är fästade och lossna
Vi kan använda de barnfäste och barnavskiljade händelserna för att lyssna på när scenen fäster eller kopplar bort en enhet:
entity.addEventListener('child-attached', function (evt) {
if (evt.detail.el.tagName.toLowerCase() === 'a-box') {
console.log('a box element has been attached');
};
});
Entity Multi-Property Component Data (setAttribute)
Uppdatering av komponentdata för flera fastigheter
För att uppdatera komponentdata för en komponent med flera egenskaper kan vi skicka namnet på en registrerad komponent som komponentnamnet och skicka ett objekt med egenskaper som värdet . En sträng är också godtagbar (t.ex. typ: spot; avstånd: 30 ), men objekt sparar A-Frame en del arbete vid parsning:
// Only the properties passed in the object will be overwritten.
entity.setAttribute('light', {
type: 'spot',
distance: 30,
intensity: 2.0
});
Eller för att uppdatera enskilda egenskaper för en komponent med flera egenskaper, kan vi skicka namnet på den registrerade komponenten som komponentnamnet , ett egendomsnamn som det andra argumentet och egenskapsvärdet som ska ställas in som det tredje argumentet:
// All previous properties for the material component (besides the color) will be unaffected.
entity.setAttribute('material', 'color', 'crimson');
Observera att arrayegenskaper fungerar unikt:
- Matriser är muterbara. De tilldelas genom referens så att ändringar i matriser kommer att synas av komponenten.
- Uppdateringar för array-typegenskaper utlöser inte komponentens uppdateringsmetod och släpper inte händelser.
Uppdatering av komponentdata för flera fastigheter
Om true överförs som det tredje argumentet till .setAttribute , kommer återställda egenskaper att återställas och klövas:
// All previous properties for the light component will be removed and overwritten.
entity.setAttribute('light', {
type: 'spot',
distance: 30,
intensity: 2.0
}, true);
Hämta en enhet
Vi kan helt enkelt hämta en enhet med DOM-API: er.
<a-entity id="mario"></a-entity>
var el = document.querySelector('#mario');
Hämta en enhetskomponenter
Om vi till exempel ville ta ett enhets tre.js-kameraobjekt eller materiella objekt, kunde vi nå in i dess komponenter
var camera = document.querySelector('a-entity[camera]').components.camera.camera;
var material = document.querySelector('a-entity[material]').components.material.material;
Eller om en komponent exponerar ett API kan vi kalla dess metoder:
document.querySelector('a-entity[sound]').components.sound.pause();