【Unity入門】シューティングゲームをBolt化してみよう(3/6)

障害物の発生と移動

Posted by 51n1 on 7 Dec, 2020

もくじ

  1. ロケットの左右移動
  2. ミサイルの発射
  3. 障害物の発生と移動
  4. ミサイルに衝突判定を付ける
  5. スコアを更新する
  6. ゲームオーバ処理

障害物の発生と移動

障害物となるRockゲームオブジェクトにFlow Machineコンポーネントを追加し、RockControllerマクロを新規作成する。チュートリアルのC#スクリプトと同じように移動速度、回転速度を保持する2つの変数としてfallSpeedとrotSpeedを定義する。fallSpeedとrotSpeedはStartイベント発生後、ランダムな値で初期化する。そしてRockゲームオブジェクトが上から下へ回転しながら落下するような処理をFlow Graphに作成し、RockゲームオブジェクトのY座標が画面下端を超えた場合は自身を破棄する。

RockControllerマクロ:変数の初期化、下方向への移動、回転、破棄

次にRockゲームオブジェクトをPrefab化し一定間隔で自動的にインスタンスとしてランダムに発生させる処理を追加する。空のゲームオブジェクトを作成し、RockGeneratorと名付け、Flow Machineコンポーネントを追加し、RockGeneratorマクロを作成する。ミサイルと同じくPrefabの変数を作成しておきRockPrefabを後でアサインしておく。

RockGeneratorマクロからInstantiateユニットを呼び出す処理を追加しようとしたが、チュートリアル内で使用しているC#関数のInvokeRepeatingはBoltでは使えないことがわかった。厳密には使えなくはないのだが、呼び出すのはC#のメソッドである必要がある。Bolt開発元のフォーラムに代替方法の記載があったので、それを参考に設定してみる。

ludiq Bolt Questions: How to use invoke and How can I use Bolt to make a method?

RockGeneratorゲームオブジェクトにはFlow Machineコンポーネントではなく、State Machineコンポーネントを追加する。デフォルトで作成されるStartステートにインスタンス生成の処理を入れる。そして右クリックメニューから「Make Self Transition」を選び、単一ステートでセルフループを作る。一定間隔でループさせるためにTransitionにTimer設定を入れる。

ここから少し苦労した。まず参照していたページに記載されていた「On Timer Elapsed」というユニットは既に廃止されていた。その代わりにTimerを使えとあったのだがこれが当初うまく動かなかった。うまくいかなかったのはTransition内でUpdateイベントを使ってしまったからなのだが、On Enter Stateイベントを使えるというのが分かるまで、While loopやWait For Secondsで試行錯誤した。While loopはBoltで使うのは怖い感じがしたし、Wait For Secondsはコルーチン内でしか使えないというのがわかった。

RockGeneratorマクロ(State Machine)

Startステートの中身

TransitionにTimerを設定。2秒経過したら次のステートへ進む、つまり元のStartステートへ戻るように設定する。

Transitionステートの中身

なんとかRockゲームオブジェクトをランダムに生成し、上から下へ回転しながら移動して、画面下端を超えると破棄されるという処理をBoltにて実装できた。

ここまでのチュートリアル進捗状況(3/6)

おまけ
Transitionラベルの表示をさせたかったので、マニュアルを元に変更しようとしたのだが、Preferences画面内のプルダウンメニューが選択できなかった。そもそもPreferencesのBoltの設定画面の挙動がおかしい。しばらく調べていたら、なんということだ。メニューの少し下をクリックしたら選択できた。バグかもしれない。

Preferences - Bolt - Transitions Reveal

RockGeneratorマクロ・設定変更後