aframe
システム
サーチ…
前書き
エンティティ・コンポーネント・システム・パターンのシステムは、コンポーネントのクラスにグローバル・スコープ、サービス、および管理を提供します。クラスのコンポーネントのパブリック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