LoginSignup
1
1

More than 3 years have passed since last update.

[PlayCanvas] イベントを使用して他のスクリプトのメソッドを実行する

Last updated at Posted at 2020-09-28

概要

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.appon()で「リスナー名」「コールバック(メソッド)」を渡す事でリスナーを登録し、off()で解除します。
使用する側はhasEvent()でリスナーがあるかを確認しfire()でそのリスナーを実行させます。
this.appにリスナーを登録するこの方法をアプリケーションイベントと言います。

今回はon()off()の第3引数にthisを渡していますが、これは必ずしも必須ではありません。
console.log()のような、特定のEntityに依存しないような処理だけであれば記述の必要はありません。
例の場合ではアトリビュートを参照しているので記述が必要になっています。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1