수색…


소개

엔티티 구성 요소 시스템 패턴의 시스템은 구성 요소 클래스에 전역 범위, 서비스 및 관리를 제공합니다. 이 클래스는 구성 요소 클래스에 대한 공용 API (메서드 및 속성)를 제공합니다. 시스템은 장면 요소를 통해 액세스 할 수 있으며 구성 요소가 글로벌 장면과 상호 작용하도록 도울 수 있습니다.

예를 들어, 카메라 시스템은 카메라 구성 요소가있는 모든 요소를 ​​관리하여 활성 카메라 인 카메라를 제어합니다.

매개 변수

매개 변수 세부
데이터 핸들러와 메소드에서 사용할 수있는 스키마에서 제공하는 데이터
엘자 <a-scene> 참조
개요 구성 요소 스키마와 동일하게 작동합니다. 데이터를 분석합니다.

비고

행동 양식

구성 요소와 같은 시스템은 수명주기 핸들러를 정의합니다. 공개 API로 의도 된 메소드를 정의 할 수도 있습니다.

방법 기술
초기화 시스템이 초기화 될 때 한 번 호출됩니다. 초기화하는 데 사용됩니다.
중지 장면이 일시 정지하면 호출됩니다. 동적 동작을 중지하는 데 사용됩니다.
놀이 장면이 시작되거나 다시 시작될 때 호출됩니다. 동적 동작을 시작하는 데 사용됩니다.
진드기 정의 된 경우 장면의 렌더링 루프 눈금마다 호출됩니다.

시스템 등록

시스템은 A- 프레임 구성 요소와 유사하게 등록됩니다.

시스템 이름이 구성 요소 이름과 일치하면 구성 요소는 시스템에 대한 참조를 this.system으로 갖게됩니다.

AFRAME.registerSystem('my-component', {
  schema: {},  // System schema. Parses into `this.data`.
  init: function () {
    // Called on scene initialization.
  },
  // Other handlers and methods.
});
AFRAME.registerComponent('my-component', {
  init: function () {
    console.log(this.system);
  }
});

시스템 액세스

장면을 통해 인스턴스화 된 시스템에 액세스 할 수 있습니다.

document.querySelector('a-scene').systems[systemName];

등록 된 시스템 프로토 타입은 AFRAME.systems 통해 액세스 할 수 있습니다.

논리와 데이터의 분리

시스템은 원하는 경우 논리와 동작을 데이터에서 분리하는 데 도움이 될 수 있습니다. 시스템이 무거운 물건을 다룰 수 있도록하고 구성 요소는 라이프 사이클 방법을 통해 데이터를 관리하는 것에 대해서만 염려합니다.

AFRAME.registerSystem('my-component', {
  createComplexObject: function (data) {
    // Do calculations and stuff with data.
    return new ComplexObject(data);
  }
});

AFRAME.registerComponent('my-component', {
  init: function () {
    this.myObject = null;
  },

  update: function () {
    // Do stuff with `this.data`.
    this.myObject = this.system.createComplexObject(this.data);
  }
});

시스템의 모든 구성 요소 수집

시스템이 구성 요소를 관리하는 방법을 정의하는 엄격한 API는 없습니다. 일반적인 패턴은 구성 요소가 시스템에 등록되도록하는 것입니다. 그런 다음 시스템에는 모든 구성 요소에 대한 참조가 있습니다.

AFRAME.registerSystem('my-component', {
  init: function () {
    this.entities = [];
  },

  registerMe: function (el) {
    this.entities.push(el);
  },

  unregisterMe: function (el) {
    var index = this.entities.indexOf(el);
    this.entities.splice(index, 1);
  }
});

AFRAME.registerComponent('my-component', {
  init: function () {
    this.system.registerMe(this.el);
  },

  remove: function () {
    this.system.unregisterMe(this.el);
  }
});


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