サーチ…


前書き

エンティティ・コンポーネント・システム・パターンのシステムは、コンポーネントのクラスにグローバル・スコープ、サービス、および管理を提供します。クラスのコンポーネントのパブリックAPI(メソッドおよびプロパティ)を提供します。システムは、シーン要素を介してアクセスすることができ、コンポーネントがグローバルシーンとインターフェースするのを助けることができる。

例えば、カメラシステムは、カメラコンポーネントを有する全てのエンティティを管理し、どのカメラがアクティブなカメラであるかを制御する。

パラメーター

パラメータ詳細
データハンドラとメソッド間で利用可能なスキーマによって提供されるデータ
エル <a-scene>への参照
スキーマコンポーネントスキーマと同じ働きをします。データを解析します。

備考

方法

コンポーネントは、ライフサイクルハンドラを定義します。公開APIを意図したメソッドを定義することもできます。

方法説明
その中にシステムの初期化時に一度呼び出されます。初期化に使用されます。
一時停止するシーンが一時停止すると呼び出されます。動的な動作を停止するために使用されます。
遊びますシーンの開始または再開時に呼び出されます。動的な動作を開始するために使用されます。
ダニ定義されている場合、シーンのレンダリングループのすべてのチックで呼び出されます。

システムの登録

A-Frameコンポーネントと同様にシステムが登録されます。

システム名がコンポーネント名と一致する場合、コンポーネントは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