实体 a-entity

方法

addState(stateName)

addState 会将状态推送到实体上。这将发出 stateadded 的事件,我们可以检查状态可使用存在**。是** :

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

发射(名称,细节,气泡)

emit 在实体上发出自定义 DOM 事件。例如,我们可以发出一个事件来触发动画:

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

我们还可以将事件详细信息或数据作为第二个参数传递:

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

该事件默认会冒泡。我们可以告诉它不要通过传递假泡泡来泡泡:

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

flushToDOM(递归)

flushToDOM 将手动序列化实体的组件数据并更新 DOM。

getAttribute(componentName)

getAttribute 检索已解析的组件数据(包括 mixins 和默认值)。

// <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}

如果 componentName 不是已注册组件的名称,则 getAttribute 将按照通常的方式运行:

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

getDOMAttribute(componentName)

getDOMAttribute 仅检索在 DOM 中或通过 setAttribute 显式定义的已解析组件数据。如果 componentName 是已注册组件的名称,则 getDOMAttribute 将仅返回 HTML 中定义的组件数据作为已解析对象。组件的 getDOMAttributegetAttribute 的部分形式,因为返回的组件数据不包括应用的 mixins 或默认值:

比较上面 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(类型)

getObject3D 查找孩子 THREE.Object3D 通过引用类型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(type, Constructor)

如果实体不具有 THREE.Object3D 下注册类型getOrCreateObject3D 会注册一个实例 THREE.Object3D 使用传递的构造。如果实体确实在类型下注册了 THREE.Object3D ,则 getOrCreateObject3D 将充当 getObject3D : **** **** ****

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

暂停()

pause() 将停止动画和组件定义的任何动态行为。当我们暂停一个实体时,它将停止其动画并在其每个组件上调用 Component.pause() 。组件决定实现暂停时发生的事情,这通常会删除事件侦听器。当我们暂停实体时,实体将在其子实体上调用 pause()

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

例如,暂停时的 look-controls 组件将删除侦听输入的事件处理程序。

玩()

play() 将启动动画和组件定义的任何动态行为。当 DOM 附加实体时,会自动调用此方法。当实体 play(),实体在其子实体上调用 play()

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

例如,播放中的声音组件将开始播放声音。

setAttribute(componentName,value,[propertyValue | clobber])

如果 componentName 不是已注册组件的名称,或者组件是单属性组件,则 setAttribute 的行为与通常情况相同:

entity.setAttribute('visible', false);

虽然如果 componentName 是已注册组件的名称,它可以处理该值的特殊解析。例如, position 组件是单属性组件,但其属性类型解析器允许它获取一个对象:

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

setObject3D(type, obj)

setObject3D 将在实体的 object3DMap 下注册传递的 obj ,一个 THREE.Object3D类型。A-Frame 将 obj 添加为实体的根对象 3D 的子节点。 **** **** ****

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

removeAttribute(componentName, propertyName)

如果 componentName 是已注册组件的名称,并且从 DOM 中删除该属性,则 removeAttribute 还将从实体中分离组件,从而调用组件的 remove lifecycle 方法。

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

如果 propertyName 的给定,的 removeAttribute 将重置由指定属性的属性值 propertyName 的该属性的默认值:

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

removeObject3D(类型)

removeObject3D 去除由指定的对象类型从该实体的 THREE.Group 并因此从场景。这将更新实体的 object3DMap ,将 type 键的值设置为 null 。这通常是从组件中调用的,通常在 remove 处理程序中调用:

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 将从实体中弹出一个状态。这将发出 stateremoved 的事件,我们可以通过检查状态的去除**。是** :

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

事件

事件名称 描述
child-attached 子实体附属于该实体。
child-detached 子实体与实体分离。
componentchanged 其中一个实体的组件已被修改。
componentinit 实体的一个组件已初始化。
componentRemoved 其中一个实体的组件已被删除。
loaded 该实体已附加并初始化其组件。
object3dset 使用 setObject3D(name) 在实体上设置 THREE.Object3D。事件详细信息将包含用于在 object3DMap 上设置的名称。
pause 该实体现在处于非活动状态,并在动态行为方面暂停。
play 该实体现在处于活跃状态并且在动态行为方面发挥作用。
stateadded 该实体获得了新的状态。
stateremoved 该实体不再具有某种状态。
schemachanged 组件的架构已更改。

事件详情

以下是每个事件的事件详细信息:

事件名称 属性 描述
child-attached el 引用附加的子元素。
componentchanged name 已修改其数据的组件的名称。
id 已修改其数据的组件的 ID。
newData 组件的新数据在修改后。
oldData 组件的先前数据,在修改之前。
componentinitialized name 已初始化的组件的名称。
id 已修改其数据的组件的 ID。
data 组件数据。
componentRemoved name 已删除的组件的名称。
id 已删除的组件的 ID。
stateadded state 附加的状态(字符串)。
stateremoved state 分离的状态(字符串)。
schemachanged component 更改了架构的组件的名称。