前回の続きです。
今回は、弾を飛ばしつつ、壁やPlayerのブロックに衝突判定をつけてみます。前回はPhysicsImposterという処理を使いましたが、今回はHavokを使います。
HavokはBabylon.jsで無償で使える物理エンジンですが、PhysicsImposterよりも色々と設定が必要です。期待した動きを作るのにかなり時間がかかりました。
環境 Babylon.js Editor v5.1.10
1. 壁に衝突判定をつける
Babylon.js Editorの機能を使って、Inspectorから物理エンジンを有効化します。また、衝突判定もつけておきます。
Friction (摩擦係数)は0、Restitution (弾性衝突) は1にしておきます。
これをWallLeft, WallRight, WallUpの3つに対して行います。
これで、壁は弾が来た時に衝突します。
2. 弾を飛ばす処理を作る
まず、前回作ったPlayer.tsにこのような処理を書いて弾が発射するようにしました。
次にBullet.tsを新しく作り、弾の動きを書きました。
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をつけて弾と弾性衝突させています。
前回の記載と異なる点です。
translateで移動するとPhysicsAggregateがうまく表示されなかったため、+=movingAmmountという移動量を都度入れた
PhysicsAggregateを新規追加。さらに、+=movingAmmoungで移動するたびにPhysicsAggregateを削除、再生成した
4. 動作を確認する
ここまで作り込むと、ブロック崩しらしい画面ができます。
5. おわりに
Havokの扱いに時間がかかりましたが、残りはGUIやスコアリングなので、早めに済ませたいと思います。

