レトロゲームプロジェクトの研究(9) インベーダーゲームっぽいの編(AlienInvaders)
「毎度おなじみのレトロゲーム風プロジェクトの研究。昨日のデバッグ作業は実はこれの話だったという」
妹「インベーダーゲームというのも、聞いたことしかないなあ。写真だけで動いてる見てないかも」
「敵が左右に動いて、端までいったら前進して……と、全体がグネグネ動きながら自機の方に向かってくる。それを自機は左右移動と前方への射撃で応戦する。自機に3回当てられるか、敵が画面下に到達すると負け。ただ防壁がなかったり、本物とは若干システムが違うけど」
「まず背景のスクロールはマテリアルだけで操作されてる。ブループリントとか使ってない。だんだんテクスチャの表示位置を下にずらしていって、はみ出した分が上から出てくる。上下にループする画像であればなんでもいいはず」
妹「画面はスクロールしてないの?」
「カメラは全く動いてない。インベーダーゲーム自体が元々固定画面のシューティングだし、このプロジェクトもそう。例えばこの背景で画面上の方から適当に敵が出てくるような仕様に改造すると、固定画面なのに縦スクロールシューティングのような雰囲気を醸し出すことが出来る」
「敵の動きはタイムラインで制御してる。まず敵全体を管理するアクタがあって、そこに敵が全部アタッチされてる。なので管理用アクタを動かすと全体が動く。ただタイムラインで制御してる都合で左右への移動量が固定になってる。つまり端っこの敵を倒しても、見てない敵が端に到達したあたりで折り返してしまう」
妹「ちゃんと端っこまで行かせるとしたら、その列の敵が居るかどうか判定して動かしたらがいいのかな。居なかったらそのまま動いてもらって」
「そんな感じで。制御もタイムラインよりティックと変数でやった方が良さそう」
「そしてこれが昨日調べてたバグ。爆弾の投下の時に、投下する敵アクタの指定がNullになるというもの。ブループリントは見やすいように整形してコメントを追加してある」
妹「それで原因はわかったの?」
「エラーが発生した時点で止めるようにしたら、敵をかなり倒して、残り数匹になった時に止まることがわかった。それでよく考えてみると、爆弾投下数より敵が少ないと、途中でTempEnemysArrayが空っぽになってしまうことに気づいた。敵が2匹として、爆弾の数が3個と決まった場合、3個目の時点でTempEnemysArrayのGET[0]は必ずNullになる」
妹「でもゲームとしてはちゃんと動いてるんだよね?」
「爆弾イベントが実行出来ないだけだから、動作上は全く問題ない。ただ終了時にエラー発生って言われるのは気持ち悪いので修正した」
「どんなに多くても敵の数よりは多くしないようにMINノードを挟むようにした。これでクリア直前で敵が少なくなってもエラーが起きずに進行する。ループの中でBranchノードで分岐するとか、ForLoopでなくForLoopWithBreakにしてBreakとか、他にも方法は色々ある。とにかく敵より爆弾を多くしないか、多くなった場合の対処ができていればOK」