수색…


소개

엔티티 구성 요소 시스템 패턴에서 구성 요소는 모양, 동작 및 / 또는 기능을 추가하기 위해 엔티티에 연결하는 재사용 가능한 모듈 덩어리의 데이터입니다.

A-Frame에서 구성 요소는 장면의 3D 객체 인 엔티티를 수정합니다. 우리는 복잡한 구성 요소를 만들기 위해 구성 요소를 함께 조합하여 구성합니다. 그것들은 three.js와 JavaScript 코드를 HTML에서 선언적으로 사용할 수있는 모듈로 캡슐화합니다. 구성 요소는 대략 CSS와 유사합니다.

비고

정의 수명주기 핸들러 메소드

스키마가 해부학 적 구조이므로 생애주기 방법은 생리학입니다. 스키마가 데이터의 모양을 정의하면 수명주기 핸들러 메소드는 데이터를 사용 하여 엔티티를 수정합니다. 핸들러는 대개 Entity API 와 상호 작용 합니다 .

메소드 개요

방법 기술
초기화 구성 요소가 초기화 될 때 한 번 호출됩니다. 초기 상태를 설정하고 변수를 인스턴스화하는 데 사용됩니다.
최신 정보 컴퍼넌트의 초기화시 및 컴퍼넌트의 property의 갱신시 ( setAttribute 경유 등)의 양쪽 모두가 불려 갔을 때에 불려갑니다. 엔티티를 수정하는 데 사용됩니다.
풀다 컴퍼넌트가 엔티티로부터 삭제 될 때 ( removeAttribute 등을 개입시켜 ), 또는 엔티티가 장면으로부터 분리되었을 때에 불려갑니다. 엔티티에 대한 모든 이전 수정 사항을 실행 취소하는 데 사용됩니다.
진드기 각 렌더 루프 또는 장면의 눈금에서 호출됩니다. 지속적인 변경이나 점검에 사용됩니다.
놀이 장면이나 엔티티가 배경이나 동적 동작을 추가 할 때마다 호출됩니다. 구성 요소가 초기화 될 때 한 번 호출됩니다. 동작을 시작하거나 다시 시작하는 데 사용됩니다.
중지 장면이나 엔티티가 일시 중지되어 배경이나 동적 동작을 제거 할 때마다 호출됩니다. 구성 요소가 엔터티에서 제거되거나 엔터티가 장면에서 분리 될 때도 호출됩니다. 행동을 일시 중지하는 데 사용됩니다.
updateSchema 임의의 컴퍼넌트의 property가 갱신 될 때마다 불려갑니다. 스키마를 동적으로 수정하는 데 사용할 수 있습니다.

구성 요소 프로토 타입 속성

방법 내에서, 우리는을 통해 구성 요소 프로토 타입에 액세스 할 수 있습니다 this :

재산 기술
this.data 스키마 기본값, mixins 및 엔터티의 특성에서 계산 된 구문 분석 된 구성 요소 속성.
this.el HTML 요소로서 [entity] [entity]에 대한 참조.
this.el.sceneEl [scene] [scene]을 HTML 요소로 참조합니다.
this.id 구성 요소에 [여러 인스턴스] [여러 개]가있을 수있는 경우 구성 요소의 개별 인스턴스 ID입니다 (예 : sound__foo foo ).

행동 양식

.init ()

.init () 는 구성 요소의 라이프 사이클 시작시 한 번 호출됩니다. 엔티티는 구성 요소의 init 처리기를 호출 할 수 있습니다.

  • 구성 요소가 HTML 파일의 엔터티에 정적으로 설정되고 페이지가로드 될 때
  • 구성 요소가 setAttribute 를 통해 첨부 된 엔터티에 설정되어있는 경우
  • 구성 요소가 연결되지 않은 엔터티에 설정되면 엔터티가 appendChild 를 통해 장면에 연결됩니다.

init 핸들러는 종종 다음을 수행하는 데 사용됩니다.

  • 초기 상태 및 변수 설정
  • 바인드 메소드
  • 이벤트 리스너 부착

예를 들어 커서 구성 요소의 init 은 상태 변수를 설정하고 메서드를 바인딩하며 이벤트 리스너를 추가합니다.

AFRAME.registerComponent('cursor', {
  // ...
  init: function () {
    // Set up initial state and variables.
    this.intersection = null;
    // Bind methods.
    this.onIntersection = AFRAME.utils.bind(this.onIntersection, this);
    // Attach event listener.
    this.el.addEventListener('raycaster-intersection', this.onIntersection);
  }
  // ...
});

.update (oldData)

.update (oldData) 는 구성 요소의 속성이 변경 될 때마다 호출됩니다 .update (oldData) 구성 요소의 수명주기 시작시 포함). 엔티티는 구성 요소의 update 처리기를 호출 할 수 있습니다.

  • init () 이 호출 된 후 구성 요소의 수명주기가 시작됩니다.
  • 구성 요소의 속성이 .setAttribute 로 업데이트되는 .setAttribute .

update 처리기는 종종 다음 작업을 수행하는 데 사용됩니다.

  • 대부분의 작업은 this.data 사용하여 엔티티에 수정 작업을 수행합니다.
  • 하나 이상의 구성 요소 등록 정보가 변경 될 때마다 엔티티를 수정하십시오.

엔티티에 대한 세부적인 변형이 [diffing의 [DIFF 의해 수행 될 수있는 현재 데이터 세트 ( this.data 업데이트 (전의 이전 데이터 집합) oldData ).

A-Frame은 구성 요소의 수명주기가 시작될 때마다 그리고 구성 요소의 데이터가 변경 될 때마다 (예 : setAttribute 의 결과 .update() 호출합니다. 업데이트 처리기는 종종 this.data 를 사용하여 엔터티를 수정합니다. 업데이트 처리기는 첫 번째 인수를 통해 구성 요소 데이터의 이전 상태에 액세스 할 수 있습니다. 구성 요소의 이전 데이터를 사용하여 세부적인 업데이트를 수행하기 위해 어떤 속성이 변경되었는지 정확하게 알 수 있습니다.

예를 들어 보이는 구성 요소의 update 는 엔터티의 가시성을 설정합니다.

AFRAME.registerComponent('visible', {
  /**
   * this.el is the entity element.
   * this.el.object3D is the three.js object of the entity.
   * this.data is the component's property or properties.
   */
  update: function (oldData) {
    this.el.object3D.visible = this.data;
  }
  // ...
});

.remove ()

.remove () 는 구성 요소가 엔터티에서 분리 될 때마다 호출됩니다. 엔티티는 구성 요소의 remove 핸들러를 호출 할 수 있습니다.

  • 구성 요소가 removeAttribute 를 통해 엔티티에서 제거 된 경우.
  • 엔티티가 장면에서 분리 될 때 (예 : removeChild ).

remove 처리기는 종종 다음 작업을 수행하는 데 사용됩니다.

  • 엔티티에 대한 구성 요소 수정 사항을 모두 제거, 실행 취소 또는 정리하십시오.
  • 이벤트 리스너를 분리합니다.

예를 들어, [조명 구성 요소] [조명]이 제거되면 조명 구성 요소는 이전에 엔티티에 설정 한 조명 객체를 제거하여 장면에서 제거합니다.

AFRAME.registerComponent('light', {
  // ...
  remove: function () {
    this.el.removeObject3D('light');
  }
  // ...
});

.tick (time, timeDelta)

.tick () 은 씬의 렌더 루프의 틱이나 프레임마다 호출됩니다. 장면은 구성 요소의 tick 핸들러를 호출합니다.

  • 렌더링 루프의 각 프레임에서.
  • 초당 60 ~ 120 번 정도.
  • 엔티티 또는 장면이 일시 중지되지 않은 경우 (예 : 관리자가 열려있는 경우)
  • 엔티티가 여전히 장면에 첨부 된 경우.

tick 처리기는 종종 다음 작업을 수행하는 데 사용됩니다.

  • 각 프레임 또는 간격에서 엔티티를 지속적으로 수정하십시오.
  • 조건에 대한 설문 조사.

tick 처리기는 밀리 초 ( time ) 및 마지막 프레임 이후의 시간차 (밀리 초) ( timeDelta )로 장면의 전체 가동 시간을 제공합니다. 이것들은 일정 간격으로 tick 핸들러의 부분만을 보간하거나 실행하는데 사용될 수 있습니다.

예를 들어 추적 된 컨트롤 구성 요소 는 컨트롤러의 애니메이션을 진행하고 컨트롤러의 위치와 회전을 업데이트하며 버튼 누름을 확인합니다.

AFRAME.registerComponent('tracked-controls', {
  // ...
  tick: function (time, timeDelta) {
    this.updateMeshAnimation();
    this.updatePose();
    this.updateButtons();
  }
  // ...
});

.pause ()

.pause () 는 엔티티 또는 장면이 일시 중지되면 호출됩니다. 엔티티는 구성 요소의 pause 처리기를 호출 할 수 있습니다.

  • 구성 요소가 제거되기 전에 remove 핸들러가 호출됩니다.
  • 엔터티가 Entity.pause () 일시 중지 된 경우
  • 장면이 Scene.pause () 일시 정지 된 경우 (예 : 관리자가 열렸을 때).

pause 처리기는 종종 다음 작업을 수행하는 데 사용됩니다.

  • 이벤트 리스너를 제거하십시오.
  • 동적 동작의 가능성을 제거하십시오.

예를 들어 사운드 구성 요소사운드 를 일시 중지하고 이벤트에서 사운드를 재생 한 이벤트 리스너를 제거합니다.

AFRAME.registerComponent('sound', {
  // ...
  pause: function () {
    this.pauseSound();
    this.removeEventListener();
  }
  // ...
});

.play ()

.play () 는 엔티티 또는 장면이 다시 시작될 때 호출됩니다. 엔티티는 구성 요소의 play 처리기를 호출 할 수 있습니다.

  • update 처리기가 호출 된 후 구성 요소가 처음 연결됩니다.
  • 엔티티가 일시 중지되었지만 Entity.play () 로 다시 시작된 경우.
  • 장면이 일시 중지되었지만 Scene.play () 로 다시 시작되었습니다.

play 처리기는 종종 다음과 같은 용도로 사용됩니다.

  • 이벤트 리스너를 추가하십시오.

예를 들어 사운드 구성 요소사운드 를 재생하고 이벤트에서 사운드를 재생할 이벤트 리스너를 업데이트합니다.

AFRAME.registerComponent('sound', {
  // ...
  play: function () {
    if (this.data.autoplay) { this.playSound(); }
    this.updateEventListener();
  }
  // ...
});

.updateSchema (data)

.updateSchema () 가 정의되어 있으면 스키마가 동적으로 수정되어야하는지 확인하기 위해 모든 업데이트에서 호출됩니다.

updateSchema 핸들러는 종종 다음 작업을 수행하는 데 사용됩니다.

  • 대개 속성 값에 따라 스키마를 동적으로 업데이트하거나 확장합니다.

예를 들어 지오메트리 구성 요소 는 다른 유형의 지오메트리에 대해 스키마를 업데이트할지 여부를 결정하기 위해 primitive 속성이 변경되었는지 확인합니다.

AFRAME.registerComponent('geometry', {
  // ...
  updateSchema: (newData) {
    if (newData.primitive !== this.data.primitive) {
      this.extendSchema(GEOMETRIES[newData.primitive].schema);
    }
  }
  // ...
});

구성 요소 방제 방법

.flushToDOM ()

문자열 화시 CPU 시간을 절약하기 위해 A-Frame은 실제 DOM에서 구성 요소의 직렬화 된 표현 만 디버그 모드로 업데이트합니다. flushToDOM ()을 호출하면 구성 요소의 데이터를 수동으로 직렬화하고 DOM을 업데이트합니다.

document.querySelector('[geometry]').components.geometry.flushToDOM();

사용자 정의 A 프레임 구성 요소 등록

AFRAME.registerComponent (name, definition)

A 프레임 구성 요소를 등록하십시오. 구성 요소를 사용하기 전에 등록해야합니다. . HTML 파일의 의미는 구성 요소가 순서대로 있어야합니다. .

  • {string} name - 구성 요소 이름입니다. HTML의 속성 명으로 나타내지는 컴퍼넌트의 public API입니다.
  • {Object} 정의 - 구성 요소 정의. 스키마 및 라이프 사이클 처리 메서드를 포함합니다.

js 파일에 foo의 구성 요소 등록하기 (예 : foo-component.js)

AFRAME.registerComponent('foo', {
  schema: {},
  init: function () {},
  update: function () {},
  tick: function () {},
  remove: function () {},
  pause: function () {},
  play: function () {}
});

장면에서 foo 구성 요소의 사용

<html>
  <head>
    <script src="aframe.min.js"></script>
    <script src="foo-component.js"></script>
  </head>
  <body>
    <a-scene>
      <a-entity foo></a-entity>
    </a-scene>
  </body>
</html>

구성 요소 HTML 양식

구성 요소는 하나 이상의 구성 요소 등록 정보의 양식으로 데이터 버킷을 보유합니다. 구성 요소는이 데이터를 사용하여 항목을 수정합니다. 엔진 구성 요소를 고려해 볼 때 마력이나 실린더와 같은 속성을 정의 할 수 있습니다.

HTML 속성은 구성 요소 이름을 나타내며 해당 속성의 값은 구성 요소 데이터를 나타냅니다.

단일 특성 구성 요소

구성 요소가 단일 속성 구성 요소 (해당 데이터가 단일 값으로 구성됨을 의미) 인 경우 HTML에서 구성 요소 값은 일반 HTML 특성과 유사합니다.

<!-- `position` is the name of the position component. -->
<!-- `1 2 3` is the data of the position component. -->
<a-entity position="1 2 3"></a-entity>

다중 특성 구성 요소

구성 요소가 여러 속성 및 값으로 구성된 다중 속성 구성 요소 인 경우 HTML에서 구성 요소 값은 인라인 CSS 스타일과 유사합니다.

<!-- `light` is the name of the light component. -->
<!-- The `type` property of the light is set to `point`. -->
<!-- The `color` property of the light is set to `crimson`. -->
<a-entity light="type: point; color: crimson"></a-entity>

compnent 스키마 객체 정의

스키마는 구성 요소의 등록 정보를 정의하고 설명하는 객체입니다. 스키마의 키는 속성의 이름이고 스키마의 값은 속성의 유형과 값을 정의합니다 (다중 속성 구성 요소의 경우).

구성 요소에 스키마 정의

AFRAME.registerComponent('bar', {
  schema: {
    color: {default: '#FFF'},
    size: {type: 'int', default: 5}
  }
}

정의 된 스키마 기본값 덮어 쓰기

<a-scene>
  <a-entity bar="color: red; size: 20"></a-entity>
</a-scene>

단일 속성 스키마

구성 요소는 단일 속성 구성 요소 (하나의 익명 값으로 구성) 또는 다중 등록 정보 구성 요소 (여러 명명 된 값으로 구성) 중 하나 일 수 있습니다. A-Frame은 스키마의 구조에 따라 구성 요소가 단일 속성 대 다중 속성인지 여부를 추측합니다.

단일 속성 구성 요소의 스키마에는 type 및 / 또는 default 키가 포함되어 있으며 스키마 값은 객체가 아닌 일반 값입니다.

AFRAME.registerComponent('foo', {
  schema: {type: 'int', default: 5}
});
<a-scene>
  <a-entity foo="20"></a-entity>
</a-scene>

A-Frame의 구성 요소 스키마 속성 유형

속성 유형은 주로 스키마가 각 속성에 대해 DOM에서 들어오는 데이터를 구문 분석하는 방법을 정의합니다. 구문 분석 된 데이터는 구성 요소의 프로토 타입에있는 data 속성을 통해 사용할 수 있습니다. 아래는 A-Frame의 내장 속성 유형입니다.

속성 유형 기술 기본값
정렬 쉼표로 구분 된 값을 배열로 구문 분석합니다 (예 : "1, 2, 3" to ['1', '2', '3']) . []
유산 일반 애셋을 가리키는 URL의 경우. url(<url>) 형식의 문자열에서 URL을 구문 분석 할 수 있습니다. 값이 요소 ID 셀렉터 ( #texture ) 인 경우,이 프로퍼티 타입은 getElementByIdgetAttribute('src') 를 호출 해 URL를 돌려줍니다. asset 속성 유형은 XHR을 처리하거나 MediaElements를 직접 반환하기 위해 변경 될 수도 있고 변경되지 않을 수도 있습니다 (예 : <img> 요소). ''
오디오 asset 속성 유형과 동일한 구문 분석. A-Frame Inspector에서 오디오 에셋을 표시하는 데 사용됩니다. ''
부울 부울 (즉, 문자열로 구문 분석 "false" false로, 다른 모든 truthy을). 그릇된
색깔 현재 구문 분석을 수행하지 않습니다. 주로 A-Frame Inspector에서 색상 선택 도구를 제시하는 데 사용됩니다. 또한 컬러 애니메이션 작업을 위해서는 컬러 형식을 사용해야합니다. #FFF
int parseInt 호출합니다 (예 : "124.5" 에서 124 ). 0
지도 asset 속성 유형과 동일한 구문 분석. A-Frame Inspector에서 텍스처 애셋을 표시하는 데 사용할 수 있습니다. ''
모델 asset 속성 유형과 동일한 구문 분석. A-Frame Inspector에서 모형 자산을 제시하는 데 사용할 수 있습니다. ''
번호 parseFloat 호출합니다 (예 : '124.5' '124.5' ). 0
선택자 querySelector 호출합니다 (예 : "#box"<a-entity id="box"> ). 없는
selectorAll querySelectorAll 호출하고 NodeListArray 로 변환합니다 (예 : ".boxes" 를 [<a-entity class = "boxes", ...]). 없는
파싱을하지 않습니다. ''
vec2 두 숫자를 {x, y} 객체 (예 : 1 -2 에서 {x: 1, y: -2} 로 파싱합니다. {x : 0, y : 0}
vec3 {x, y, z} 객체에 3 개의 숫자를 파싱합니다 (예 : 1 -2 3 에서 {x: 1, y: -2, z: 3} . {x : 0, y : 0, z : 0}
vec4 {x, y, z, w} 객체에 4 개의 숫자를 파싱합니다 (예 : 1 -2 3 -4.5 에서 {x: 1, y: -2, z: 3, w: -4.5} . {x : 0, y : 0, z : 0, w : 0}
부동산 유형 추론

스키마는 기본값 만 주어진 속성 유형을 유추하려고 시도합니다.

schema: {default: 10}  // type: "number"
schema: {default: "foo"}  // type: "string"
schema: {default: [1, 2, 3]}  // type: "array"

속성 유형이 주어지면 스키마는 제공되지 않으면 기본값을 설정합니다.

schema: {type: 'number'}  // default: 0
schema: {type: 'string'}  // default: ''
schema: {type: 'vec3'}  // default: {x: 0, y: 0, z: 0}
사용자 정의 속성 유형

우리는 또한 제공하여 우리 자신의 속성 유형 또는 파서를 정의 할 수 있습니다 parse a 대신에 기능을 type :

schema: {
  // Parse slash-delimited string to an array 
  // (e.g., `foo="myProperty: a/b"` to `['a', 'b']`).
  myProperty: {
    default: [],
    parse: function (value) {
      return value.split('/');
    }
  }
}

구성 요소의 멤버 및 메서드 액세스

구성 요소의 멤버 및 메서드는 .components 객체의 엔터티를 통해 액세스 할 수 있습니다. 엔티티의 구성 요소 맵에서 구성 요소를 조회하면 구성 요소의 내부에 액세스 할 수 있습니다. 다음 예제 구성 요소를 고려하십시오.

AFRAME.registerComponent('foo', {
  init: function () {
    this.bar = 'baz';
  },
  qux: function () {
    // ...
  }
});

barqux 메소드에 액세스 해 봅시다.

var fooComponent = document.querySelector('[foo]').components.foo;
console.log(fooComponent.bar);
fooComponent.qux();


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