aframe
エンティティ
サーチ…
前書き
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 | エンティティがアクティブかどうかを示します。エンティティを一時停止すると、isPlayingはfalseになります。 |
オブジェクト3D | <a-entity>.object3D は、エンティティのthree.js Object3D表現への参照です。より具体的には、object3DはTHREE.Group オブジェクトであり、カメラ、メッシュ、ライト、サウンドなどのさまざまな種類のTHREE.Object3D 含むことができます。 |
オブジェクト3DMap | エンティティのobject3DMapは、コンポーネントが設定したさまざまな種類のTHREE.Object3D(カメラ、メッシュ、ライト、サウンドなど)にアクセスできるオブジェクトです。 |
シーンE1 | エンティティは、そのscene要素への参照を持ちます。 |
備考
方法
addState(stateName)
addStateは状態をエンティティにプッシュします。これによりstateaddedイベントが発生し、 .isを使用して状態canを確認することができます。
entity.addEventListener('stateadded', function (evt) {
if (evt.detail.state === 'selected') {
console.log('Entity now selected!');
}
});
entity.addState('selected');
entity.is('selected'); // >> true
エミット(名前、詳細、泡)
emitはエンティティでカスタムDOMイベントを発行します。たとえば、アニメーションをトリガするイベントを発生させることができます。
<a-entity>
<a-animation attribute="rotation" begin="rotate" to="0 360 0"></a-animation>
</a-entity>
entity.emit('rotate');
イベントの詳細やデータを2番目の引数として渡すこともできます。
entity.emit('collide', { target: collidingEntity });
このイベントはデフォルトでバブルになります。私たちはバブルのためにfalseを渡すことによってバブルしないように伝えることができます:
entity.emit('sink', null, false);
flushToDOM(再帰的)
flushToDOMは、エンティティのコンポーネントのデータを手動でシリアル化し、DOMを更新します。
getAttribute(componentName)
getAttributeは、解析されたコンポーネントデータ(ミックスインとデフォルトを含む)を取得します。
// <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で定義されたコンポーネントデータのみを解析されたオブジェクトとして返します。コンポーネントのgetDOMAttributeは、返されたコンポーネントデータに適用されたmixinsまたはデフォルト値が含まれていないため、 getAttributeの部分形式です。
上記の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(タイプ)
getObject3Dは object3DMap上のタイプで参照される子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(型、コンストラクタ)
エンティティタイプの下に登録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()は、アニメーションやコンポーネントで定義された動的動作を開始します。これは、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は、渡されたobj 、 THREE.Object3Dを 、エンティティのobject3DMapの下の型として登録します。 A-Frameは、エンティティのルートオブジェクト3Dの子としてobjを追加します。
AFRAME.registerComponent('example-orthogonal-camera', {
update: function () {
this.el.setObject3D('camera', new THREE.OrthogonalCamera());
}
});
removeAttribute(componentName、propertyName)
componentNameが登録されたコンポーネントの名前であり、DOMから属性を削除すると同時に、 removeAttributeは、コンポーネントのremoveライフサイクルメソッドを呼び出して、そのコンポーネントをエンティティからデタッチします。
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(タイプ)
removeObject3Dは、 typeで指定されたオブジェクトをエンティティのTHREE.Groupから、したがってシーンから削除します。これは、エンティティのobject3DMapを更新し、 タイプキーの値をnullに設定します 。これは一般的にコンポーネントから呼び出されます。多くの場合、removeハンドラ内にあります。
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
イベント
イベント名 | 説明 |
---|---|
子供が付いた | 子エンティティがエンティティに追加されました。 |
幼児 | 子エンティティがエンティティから切り離されました。 |
コンポーネントが変更された | エンティティのコンポーネントの1つが変更されました。 |
componentinit | エンティティのコンポーネントの1つが初期化されました。 |
コンポーネントが削除されました | エンティティのコンポーネントの1つが削除されました。 |
ロードされた | エンティティは、そのコンポーネントをアタッチして初期化しています。 |
object3dset | THREE.Object3Dは、setObject3D(name)を使用してエンティティに設定されました。イベントの詳細には、object3DMapに設定するための名前が含まれます。 |
一時停止する | エンティティは動的な動作の点で非アクティブで一時停止しています。 |
遊びます | エンティティは現在アクティブであり、動的な振る舞いに関して再生しています。 |
国営 | エンティティは新しい状態を受け取りました。 |
stateremoved | エンティティはもはや特定の状態を持たない。 |
スキーマチャレンジ | コンポーネントのスキーマが変更されました。 |
イベントの詳細
以下は、各イベントのイベントの詳細です。
イベント名 | プロパティ | 説明 |
---|---|---|
子供が付いた | エル | 添付された子要素への参照。 |
コンポーネントが変更された | 名 | データが変更されたコンポーネントの名前。 |
id | データが変更されたコンポーネントのID。 | |
newData | コンポーネントの新しいデータ(変更後)。 | |
oldData | コンポーネントが変更される前のコンポーネントの以前のデータ | |
コンポーネント初期化 | 名 | 初期化されたコンポーネントの名前。 |
id | データが変更されたコンポーネントのID。 | |
データ | コンポーネントデータ。 | |
コンポーネントが削除されました | 名 | 削除されたコンポーネントの名前。 |
id | 削除されたコンポーネントのID。 | |
国営 | 状態 | 接続された状態(文字列)。 |
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)
複数のプロパティのコンポーネントデータの更新
マルチ性成分のためのコンポーネントデータを更新するために、我々はcomponentとして登録コンポーネントの名前を渡し、および値などのプロパティのオブジェクトを渡すことができます。文字列も受け入れ可能です(例: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
});
またはマルチ性コンポーネントの個々のプロパティを更新するために、我々はcomponent、第二引数として、プロパティ名、および3番目の引数として設定するプロパティの値として登録コンポーネントの名前を渡すことができます。
// All previous properties for the material component (besides the color) will be unaffected.
entity.setAttribute('material', 'color', 'crimson');
配列プロパティの型は一意的に動作することに注意してください。
- 配列は変更可能です。それらは参照によって割り当てられるので、配列の変更はコンポーネントによって可視になります。
- 配列型のプロパティを更新しても、コンポーネントのupdateメソッドやイベントは発生しません。
複数のプロパティのコンポーネントデータの更新
trueが3番目の引数として.setAttributeに渡された場合、指定されていないプロパティはリセットされ、clobberedされます。
// 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();