CrossRoad

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

Babylon.jsで弾を飛ばす処理を作ってみよう

これはBabylon.js アドベントカレンダー2022の記事です。

qiita.com

今回はキー入力をしたら弾が飛ぶ、というシンプルな表現の作り方を紹介します。
実際は他にも方法があるはずなので、今回の紹介は一例としてご理解ください。

1. まずは物理演算を有効にする

このように書きます。このenablePhysicsを使わないと、後半で解説するApplyImpulseが動きません。
gist.github.com

Physics | Babylon.js Documentation

2. 画面中心に照準マークをつける

例えばこのように書きます。小さめのsphereを表示させ、cameraの子オブジェクトにすることで、向きを変えても常に画面中心に標準が表示されます。
gist.github.com

Simple reticles on Babylon.js

この時点の内容は、以下で確認できます。
https://www.babylonjs-playground.com/#JVZU08

3. 画面中心と垂直方向にrayを飛ばす

getForwardRayを使います。

gist.github.com

4. 弾を生成してキー入力によって発射する

createInstanceにより、あらかじめ作っておいたbulletというsphereのコピーを作り、これをapplyImpluseで飛ばします。飛ばす方向は先ほど準備しておいたrayで決まります。

impulseMagnitudeの値を大きくすると弾丸の速度が増します。
gist.github.com

キー入力はonKeyboardObservable.addを使います。

この時点の内容はこのようになります。
Shooting bullets on Babylon.js

5. 一定距離を超過した弾オブジェクトを削除する

先ほどの内容で実質完成ですが、あのままだとボタンを押すたびに弾オブジェクトが増えてしまいます。そこで一定座標を超えたらdispose (削除) する処理を追加します。

gist.github.com

これでzで100以上、あるいは-100以下まで弾が移動したらdisposeされます。

以上の内容はこちらから確認できます。キーボードのaを押してみてください。

https://www.babylonjs-playground.com/#JVZU08#1

6. おわりに

シューティングゲームを作る、何かを動かす処理を作るときの参考になれば幸いです。