カスタムJavaScriptコンポーネント
初めてのステップでの続きです。
概要
このチュートリアルの目標は、プロジェクトにカスタムロジックを追加することに慣れることです。
特定のオブジェクトが見られたフレーム数をカウントできる2つのスクリプトを作成します。
1つのスクリプトはカメラに追加され、特定のオブジェクトを見ているかどうかを確認するためのレイをキャストします。もう1つはオブジェクトに追加され、フレームカウントを表示するものです。
JavaScriptのリローディング
作業フローをできるだけスムーズにするために、エディタはJavaScriptファイルの変更を自動的に監視し、保存時にそれらを解析します。
ブラウザでアプリを実行している場合、変更内容でページを自動的にリロードしてくれます。
JavaScriptコンポーネントの作成
「アセットブラウザ」で空いているスペースを右クリックし、新しいJavaScriptコンポーネントを追加します。
コンポーネントの名前をcounting-gaze.jsとします。
ファイルをダブルクリックすると、システムで.jsファイルを開くように設定したアプリケーションで開かれます。
コード
最後に、コンポーネントに命を吹き込みます。次のコードは、毎フレームシーンにレイをキャストします。
import {Component} from '@wonderlandengine/api';
export class CountingGaze extends Component {
static TypeName = 'counting-gaze';
origin = [0, 0, 0];
dir = [0, 0, 0];
init() {
console.log('Counting gaze initialized');
}
update() {
/* このオブジェクトの位置を取得し、"origin"に格納します。 */
this.object.getPositionWorld(this.origin);
/* このオブジェクトの方向を取得し、"dir"に格納します。 */
this.object.getForwardWorld(this.dir);
/* シーンにレイを送り、衝突グループ"1"または"2"のオブジェクトに
* 当たるかどうかを確認します。 */
const rayHit = this.engine.scene.rayCast(
this.origin, this.dir, (1 << 1) | (1 << 2));
if(rayHit.hitCount > 0) {
for(let i = 0; i < rayHit.hitCount; ++i) {
let o = rayHit.objects[i];
// TODO: 後でここでヒットしたオブジェクトのカウンタを
// 増やします!
console.log('Raycast hit object:', o.name);
}
}
}
} 今のところ、レイキャストでヒットしたオブジェクトの名前を表示しています。
オブジェクトにコンポーネントを追加
このコンポーネントは自動的に実行されません。カメラにアタッチする必要があります!
実行
コンポーネントを実際に動作させるには、「パッケージ化」して「ブラウザを開く」を選択します。
Ctrl + Shift + CでブラウザのJavaScriptコンソールを開くと、コンポーネントが初期化されたことがわかります。
しかし、オブジェクト名は表示されません。this.engine.scene.rayCast()はcolliderコンポーネントと連携する衝突システムを利用しているため、レイキャストが何かに当たるようにするには、さらにコンポーネントを追加する必要があります!
衝突
次のスクリーンショットに示すように、郵便受けオブジェクトに子を追加します。
その新しい子オブジェクトにcollisionコンポーネントを追加します。
半径を例えば0.15に設定します。
この設定で、レイキャストが機能することを確かめるために「パッケージ化」します。
カウントと表示
カウントを追跡し、最終的にはテキストコンポーネントで表示する必要があります。
「コライダー」オブジェクトに「テキスト」コンポーネントを追加し、テキストを「0」に変更します。
次に、gaze-counter.jsという名前の新しいJavaScriptソースファイルを追加します。
import {Component, Property} from '@wonderlandengine/api';
export class GazeCounter extends Component {
static TypeName = 'gaze-counter';
static Properties = {
msg: Property.string('i')
};
count = 0;
init() {
console.log('Gaze counter initialized');
}
start() {
this.textComp = this.object.getComponent('text');
}
update() {
this.textComp.text = `${this.msg} ${this.count}`;
}
} ここにmsgプロパティがあります。エディタは、“コライダー”オブジェクトにコンポーネントを追加した際に自動的に入力フィールドを生成します。
最後に、counting-gaze.jsの// TODOコメントを次のコードに置き換えます。
const counterComp = o.getComponent('gaze-counter');
if(counterComp) {
counterComp.count++;
} 結果
「パッケージ化」してブラウザを確認します。最終結果が見えます!
まとめ
Wonderland Engineでは、ブラウザで実行できる任意のJavaScriptライブラリを使用できます。
自動リローディングにより、とても迅速な反復が可能です。
Wonderland Engine JavaScript APIリファレンスはこちら および多くの短いチュートリアルはこちらを参照してください。