實體 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 更改了架構的元件的名稱。