수색…


소개

A-Frame은 <a-entity> 요소를 통해 개체를 나타냅니다. 엔티티 구성 요소 시스템 패턴에서 정의 된대로 엔티티는 표시, 동작 및 기능을 제공하기 위해 구성 요소를 연결하는 자리 표시 객체입니다.

통사론

  • <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:

매개 변수

매개 변수 세부
구성 요소들 <a-entity>.components 는 엔터티에 연결된 구성 요소의 개체입니다. 이렇게하면 각 구성 요소의 데이터, 상태 및 메서드를 비롯한 엔터티의 구성 요소에 액세스 할 수 있습니다.
놀고있다 엔티티가 활성 상태이고 재생 중인지 여부입니다. 엔터티를 일시 중지하면 isPlaying이 false가됩니다.
object3D <a-entity>.object3D 는 엔티티의 three.js Object3D 표현에 대한 참조입니다. 보다 구체적으로, object3D는 카메라, 메시, 라이트 또는 사운드와 같은 THREE.Object3D 의 여러 유형을 포함 할 수있는 THREE.Group 객체입니다.
object3mapap 엔티티의 object3DMap은 구성 요소가 설정 한 다양한 유형의 THREE.Object3D (예 : 카메라, 메시, 라이트, 사운드)에 대한 액세스를 제공하는 객체입니다.
sceneEl 엔티티는 장면 요소에 대한 참조를 가지고 있습니다.

비고

행동 양식


addState (stateName)

addState 는 상태를 엔터티로 푸시합니다. 그러면 stateadded 이벤트가 발생하고 상태를 확인할 수 있습니다 .is :

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

emit (이름, 세부 사항, 거품)

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 및 defaults 포함)를 검색합니다.

// <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에 정의 된 구성 요소 데이터 만 구문 분석 객체로 반환합니다. 반환 된 구성 요소 데이터에는 적용된 mixins 또는 기본값이 포함되지 않으므로 구성 요소의 getDOMAttributegetAttribute 의 부분 형식입니다.

위의 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 (유형)

getObject3Dobject3DMap의 type 에 의해 참조 된 자식 THREE.Object3D찾습니다 .

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, 생성자)

엔티티에 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 ()

play () 는 애니메이션 및 구성 요소에 정의 된 동적 동작을 시작합니다. 이것은 DOM이 엔티티를 첨부 할 때 자동으로 호출됩니다. 엔터티가 play () 될 때 엔터티는 자식 엔터티에 대해 play () 를 호출 합니다 .

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

예를 들어 재생중인 사운드 구성 요소가 사운드 재생을 시작합니다.


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

componentName 가 등록 된 구성 요소의 이름이 아니거나 구성 요소가 단일 등록 정보 구성 요소 인 경우 setAttribute 는 평소와 같이 작동합니다.

entity.setAttribute('visible', false);

componentName 가 등록 된 구성 요소의 이름이라면 값에 대한 특수 구문 분석을 처리 할 수 ​​있습니다. 예를 들어, 위치 구성 요소 는 단일 속성 구성 요소이지만 속성 유형 파서는 객체를 가져올 수 있습니다.

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

setObject3D (type, obj)

setObject3D 는 전달 된 objTHREE.Object3D를 엔티티의 object3DMap 아래에 유형 으로 등록합니다. A-Frame은 엔티티의 루트 object3D 의 자식으로 obj 를 추가합니다.

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

removeAttribute (componentName, propertyName)

componentName 이 등록 된 구성 요소의 이름이고 DOM에서 속성을 제거하는 경우 removeAttribute 는 구성 요소의 제거 라이프 사이클 메소드를 호출하여 구성 요소를 엔티티에서 분리합니다.

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 (유형)

removeObject3Dtype 으로 지정된 객체를 엔티티의 THREE.Group 에서 제거하여 씬에서 제거합니다. 이것은 엔티티의 object3DMap 을 갱신하여 유형 키의 값을 널 (NULL)로 설정합니다. 이것은 일반적으로 구성 요소에서 호출되며 일반적으로 제거 핸들러 내에서 자주 호출됩니다.

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 이벤트가 발생하고 상태를 확인할 수 있습니다 .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

이벤트

이벤트 이름 기술
아이가 붙은 하위 엔티티가 엔티티에 접속되었습니다.
어린이 분리형 하위 엔티티가 엔티티에서 분리되었습니다.
구성 요소가 변경된 엔티티 구성 요소 중 하나가 수정되었습니다.
구성 요소 엔티티의 구성 요소 중 하나가 초기화되었습니다.
componentremoved 엔티티 구성 요소 중 하나가 제거되었습니다.
짐을 실은 엔터티가 해당 구성 요소를 연결하고 초기화했습니다.
object3dset THREE.Object3D는 setObject3D (name)를 사용하여 엔티티에 설정되었습니다. 이벤트 세부 사항에는 object3DMap에서 설정하는 데 사용되는 이름이 포함됩니다.
중지 엔티티는 이제 비활성 상태이고 동적 동작 측면에서 일시 중지되었습니다.
놀이 엔티티는 이제 동적 동작의 측면에서 활성화되어 재생됩니다.
stateadded 엔터티가 새 상태를 받았습니다.
stateremoved 엔티티는 더 이상 특정 상태가 아닙니다.
스키마가있는 구성 요소의 스키마가 변경되었습니다.

사건 세부 사항

다음은 각 이벤트에 대한 이벤트 세부 정보입니다.

이벤트 이름 재산 기술
아이가 붙은 엘자 첨부 된 자식 요소에 대한 참조입니다.
구성 요소가 변경된 이름 데이터가 수정 된 구성 요소의 이름입니다.
신분증 데이터가 수정 된 구성 요소의 ID입니다.
newData 구성 요소의 새 데이터 (수정 된 후).
oldData 구성 요소의 수정 전의 이전 데이터
구성 요소 초기화 이름 초기화 된 구성 요소의 이름입니다.
신분증 데이터가 수정 된 구성 요소의 ID입니다.
데이터 구성 요소 데이터.
componentremoved 이름 제거 된 구성 요소의 이름입니다.
신분증 제거 된 구성 요소의 ID입니다.
stateadded 상태 첨부 된 상태입니다 (문자열).
stateremoved 상태 분리 된 상태 (문자열).
스키마가있는 구성 요소 스키마가 변경된 구성 요소의 이름입니다.

구성 요소 변경 청취

우리는 componentchanged 이벤트를 사용하여 엔티티에 대한 변경 사항을 수신 할 수 있습니다.

entity.addEventListener('componentchanged', function (evt) {
  if (evt.detail.name === 'position') {
    console.log('Entity has moved from', 
      evt.detail.oldData, 'to', evt.detail.newData, '!');
  }
});

첨부 및 분리 된 자식 요소 청취

어린이가 붙인 이벤트와 자식 분리 이벤트를 사용하여 장면이 엔티티를 부착하거나 분리 할 때들을 수 있습니다.

entity.addEventListener('child-attached', function (evt) {
  if (evt.detail.el.tagName.toLowerCase() === 'a-box') {
    console.log('a box element has been attached');
  };
});

엔티티 다중 특성 구성 요소 데이터 (setAttribute)

다중 속성 구성 요소 데이터 업데이트

다중 속성 요소에 대한 구성 요소 데이터를 업데이트하기 위해, 우리는 componentName로서 등록 된 구성 요소의 이름을 전달하고, 속성의 객체를 전달할 수있다. 문자열도 허용됩니다 (예 : type : spot, distance : 30 ). 그러나 객체는 A-Frame을 구문 분석에 사용할 수 있도록 저장합니다.

// Only the properties passed in the object will be overwritten.
entity.setAttribute('light', {
  type: 'spot',
  distance: 30,
  intensity: 2.0
});

또는 다중 속성 컴포넌트의 개별 속성을 갱신하기 위해, 우리는 componentName 번째 인수로서 속성 명, 세 번째 인자로 설정하는 특성 값으로 등록 된 구성 요소의 이름을 전달할 수있다 :

// All previous properties for the material component (besides the color)  will be unaffected.
entity.setAttribute('material', 'color', 'crimson');

배열 속성 유형은 고유하게 동작합니다.

  • 배열은 변경할 수 있습니다. 배열에 대한 변경 사항은 구성 요소에서 볼 수 있도록 참조에 의해 지정됩니다.
  • 배열 유형 속성을 업데이트해도 구성 요소의 업데이트 메서드가 트리거되거나 이벤트가 발생하지 않습니다.

다중 속성 구성 요소 데이터 업데이트

true 가 세 번째 인수로 .setAttribute에 전달되면 지정되지 않은 속성이 재설정되고 제한됩니다.

// All previous properties for the light component will be removed and overwritten.
entity.setAttribute('light', {
  type: 'spot',
  distance: 30,
  intensity: 2.0
}, true);

엔티티 검색

우리는 단순히 DOM API를 사용하여 엔티티를 검색 할 수 있습니다.

<a-entity id="mario"></a-entity>
var el = document.querySelector('#mario');

엔티티 구성 요소 검색

예를 들어, 엔티티의 three.js 카메라 객체 또는 머티리얼 객체를 잡으려면 해당 구성 요소에 접근 할 수 있습니다

var camera = document.querySelector('a-entity[camera]').components.camera.camera;
var material = document.querySelector('a-entity[material]').components.material.material;

또는 구성 요소가 API를 노출하는 경우 해당 메소드를 호출 할 수 있습니다.

document.querySelector('a-entity[sound]').components.sound.pause();


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow