概要
PlayCanvasの提供しているイベントを使用することで他のスクリプト、または他のEntityが持つメソッドを呼び出す事が可能です。
以前の記事の概要で書いた「衝突した対象に影響を与える」ような処理ではなく「どこかにいるEntityで処理してほしい」という処理が実現できます。
これにより、Entityの設計などを細かく調整する必要性から開放され、よりシンプルなコードになります。
実装例
mouse.js
var Mouse = pc.createScript('mouse');
Mouse.prototype.initialize = function() {
this.app.mouse.on(pc.EVENT_MOUSEDOWN, this.mouseDown, this);
};
Mouse.prototype.mouseDown = function(event) {
// 呼び出したいイベントが登録されているか
if( this.app.hasEvent('onClickEvent') ){
// イベントを発火させる
this.app.fire('onClickEvent', event.x, event.y);
}
};
eventListener.js
var EventListener = pc.createScript('eventListener');
EventListener.attributes.add('textUI', {type: 'entity'});
EventListener.prototype.initialize = function() {
// イベントリスナーを登録する
this.app.on('onClickEvent', this.onClick, this);
// このEntityが破棄された時にリスナーの登録を解除する(やらないとメモリリークを起こす)
this.on('destroy', function() {
this.app.off('onClickEvent', this.onClick, this);
});
};
EventListener.prototype.onClick = function(x, y) {
this.textUI.element.text = 'Clicked Screen Position X: ' + x.toString() + 'Y:' + y.toString();
};
this.appに**on()**で「リスナー名」「コールバック(メソッド)」を渡す事でリスナーを登録し、off()で解除します。
使用する側はhasEvent()でリスナーがあるかを確認しfire()でそのリスナーを実行させます。
this.appにリスナーを登録するこの方法をアプリケーションイベントと言います。
今回はon()とoff()の第3引数にthisを渡していますが、これは必ずしも必須ではありません。
**console.log()**のような、特定のEntityに依存しないような処理だけであれば記述の必要はありません。
例の場合ではアトリビュートを参照しているので記述が必要になっています。