見出し画像

Phaser3の2D描画とEffekseer for WebGL の連携方法

Phaser3でPCゲームを絶賛制作中です。
Scratchでプログラミング x オートバトルなシューティングゲームです。
2025年内リリース目標で進めております。
もしよければウィッシュリスト登録よろしくお願いいたします!

このゲーム、エフェクトをEffekseerという神ツールで作成しています。https://effekseer.github.io/jp/

Effekseer 1.7はWebGL上で再生する機能を提供しているのですが、こちらをPhaser3の2D描画系と連携する方法をご紹介します。


1. Effekseerを再生する

こちらの通りに実装すれば再生できるはず。

(最重要) useWASMとfastRenderModeはfalseにする

これでハマりました。忘れないでください。

2.エフェクト作成時に深度テストを無効にする

Effekseerエディタの画面上で深度テストが無効になっている状態

Effekseerエディタでエフェクトを作成する際に、描画共通プロパティの深度テストのチェックを外しておきます。

3. Phaser3のGameObjectのようにDepthを設定する

Phaser3のExternオブジェクトを使用し、それぞれDepthを設定、Effekseerを描画するrender関数を実装します。 また、各ExternオブジェクトでEffekseerContextを分けます

以下TypeScriptの例です。

const frontContext = effekseer.createContext();

...(frontContextの初期化処理)...

const middleContext = effekseer.createContext();

...(middleContextの初期化処理)...

let currentTime = 0;
...(Phaserの初期化処理開始)...
create() {
  ...
  const view = this.add.extern();
  view.setDepth(1);
  let prevTime = 0;
  (view as any).render = () => {
    const delta = currentTime - prevTime;
    middleContext.setProjectionMatrix(Float32Array.from(camera!.projectionMatrix.elements));
    middleContext.setCameraMatrix(Float32Array.from(camera!.matrixWorldInverse.elements));
    middleContext.update(delta * 60);
    middleContext.draw();
    prevTime = currentTime;
  };

  const frontView = this.add.extern();
  frontView.setDepth(100);
  let prevTimeFront = 0;
  (frontView as any).render = () => {
    const delta = currentTime - prevTimeFront;
    frontContext.setProjectionMatrix(Float32Array.from(camera!.projectionMatrix.elements));
    frontContext.setCameraMatrix(Float32Array.from(camera!.matrixWorldInverse.elements));
    frontContext.update(delta * 60);
    frontContext.draw();
    prevTimeFront = currentTime;
  };
},
update(time: number) {
  ...
  currentTime = time;
}

以上

プログラミング自信ニキの皆様にお楽しみいただけるよう丹精込めて制作中です。
ウィッシュリスト登録よろしくお願いいたします!
何卒!

いいなと思ったら応援しよう!