CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

Babylon.js Editor v5でもう一度ブロック崩しゲームを作ってみる (弾を飛ばして衝突判定)

前回の続きです。

www.crossroad-tech.com

今回は、弾を飛ばしつつ、壁やPlayerのブロックに衝突判定をつけてみます。前回はPhysicsImposterという処理を使いましたが、今回はHavokを使います。

HavokはBabylon.jsで無償で使える物理エンジンですが、PhysicsImposterよりも色々と設定が必要です。期待した動きを作るのにかなり時間がかかりました。

環境 Babylon.js Editor v5.1.10

1. 壁に衝突判定をつける

Babylon.js Editorの機能を使って、Inspectorから物理エンジンを有効化します。また、衝突判定もつけておきます。

Physics settings on Babylon.js Editor v5

Friction (摩擦係数)は0、Restitution (弾性衝突) は1にしておきます。

これをWallLeft, WallRight, WallUpの3つに対して行います。

これで、壁は弾が来た時に衝突します。

2. 弾を飛ばす処理を作る

まず、前回作ったPlayer.tsにこのような処理を書いて弾が発射するようにしました。

gist.github.com

次にBullet.tsを新しく作り、弾の動きを書きました。

gist.github.com

PhysicsAggregateによって、sphereメッシュに物理エンジンの挙動をつけています。_aggregate.bodyはUnityでのRigidBodyに相当します。

宣言をした後、this._aggregate.body.setLinearVelocity(velocity);によって等速直線運動で弾を動かしています。

dispose()の処理の中では this._aggregate.dispose();とthis.mesh.dispose();があります。これはUnityと異なるところなのですが、meshを消しただけでは物理エンジンが消えません。

また、RigidBody相当であるthis._aggregate.bodyの物体?はmeshと一緒に同期しませんでした。そのため、meshを移動させる場合はPhysicsAggregateを都度移動させる必要がありました。

実際はそんなことない気がするので、もし改善方法が見つかったら掲載します。

3. 操作Playerに衝突判定をつける

前回の記事で記載したのはPlayerであるブロックの左右移動のみでした。今回は、Playerにcollisionをつけて弾と弾性衝突させています。

gist.github.com

前回の記載と異なる点です。

  • translateで移動するとPhysicsAggregateがうまく表示されなかったため、+=movingAmmountという移動量を都度入れた

  • PhysicsAggregateを新規追加。さらに、+=movingAmmoungで移動するたびにPhysicsAggregateを削除、再生成した

4. 動作を確認する

ここまで作り込むと、ブロック崩しらしい画面ができます。

Playback example of Babylon.js Editor v5

5. おわりに

Havokの扱いに時間がかかりましたが、残りはGUIやスコアリングなので、早めに済ませたいと思います。