ITエンジニアのための勉強会・イベントレポート情報メディア

Unityで作ろう!ゲームアルゴリズム(7)2Dシューティングのアルゴリズムを作ってみた
skill

Unityで作ろう!ゲームアルゴリズム(7)
2Dシューティングのアルゴリズムを作ってみた

2017.04.20

 
  • このエントリーをはてなブックマークに追加

みなさんはNintendo Switch買いました?
Unityは3DS・Wii U・Nintendo Switchなど各種任天堂ハード向けのゲーム開発をサポートしていて、Unityで作られたインディーズゲームが任天堂の公式ストアにて販売されています。本記事の執筆時点ではまだSwitchのストアを見ることはできませんが、きっとたくさんのインディーズゲームが並ぶことでしょう。いつか「自分が作ったゲームがSwitchで遊べるんだぜー!買え!!」と言ってみたいですね〜

さてさて、深くなりがちなプロシージャルのお話は前回でひと区切り。
今回は原点回帰ということで、シューティングゲームを作ってみます。

賀好 昭仁

シューティングについて

ゲームを作るならまずはシューティングから!と言っても過言ではないくらい直感的で作りやすいゲームジャンルです。
(「面白いシューティングゲーム」を作るのは大変ですけどね!)

  • ・自機はどんどん前に進んでいく。
  • ・弾を撃って敵を撃破する。
  • ・敵の弾に当たったらゲームオーバー。

とってもわかりやすいルールです。

今回は懐かしのゼビウス的な、縦スクロール型の2Dシューティングゲームに挑戦してみました。

Unityでシューティングを開発するにあたって

Unityにはシューティングに使えるたくさんの機能があります。

Unityのゲームオブジェクトは、タグ付けしたりレイヤーを分けたりできます。それにより、自機の弾は的にだけ当たり、敵の弾は自機にだけ当たるといった制御を簡単に実現することができます。
また、Colliderを使用することで当たり判定もバッチリ。
敵の動作はTween系のライブラリを導入するとかなり楽に実装できます。

このようにシューティングに役立つ機能はたくさん揃っているUnityですが、大量の敵や弾を出現させると極端にパフォーマンスが低下してしまうこともありますので、その点は注意して開発を進めましょう!

余談:当たり判定について
初期のシューティングでは基本的に自機の当たり判定が自機の絵と同じ大きさだけあり、翼をかすめるだけでドカーンでした。
そのため、シューティングの攻略には「敵を効率的に倒す」ことや「上手い立ち回り」の技術が非常に重要で、プレイヤーはそれらの技術の向上に努めていました。
そんな中、1990年代後半頃から弾幕系シューティングというものが登場し始めました。
弾幕系シューティングでは自機の当たり判定はツメの先ほどしか無く、美しささえ感じるほど大量にバラ撒かれた弾幕をすり抜けていきます。
「敵を効率的に倒す」ことや「上手い立ち回り」などそれまでのシューティングで重視されてきた点にではなく、「華麗に避けること」に主眼を置くことで、シューティングというジャンルの中で大きなイノベーションが起こったと言えるでしょう。
ちなみに筆者は弾幕系シューティングがとっても下手くそで、1面でゲームオーバーとかもザラです(笑)。

必要な処理を考えてみる

では、シューティングを作るにあたって必要な処理を考えてみましょう。

まずは自機。
弾を発射し、自由に操作できる自機のクラスを定義します。
必要なパラメータは、ひとまずライフ(残基数)、パワーアップの状態くらいがあれば十分でしょう。
あとは当たり判定の処理を書く必要がありますね。
「敵の弾、もしくは敵にあたるとライフが減る」といったイメージです。

つづいて敵。
敵も自機と同じようなもので、ライフは必要でしょう。
撃墜した時のスコアなどもあった方が良さそうです。
また、撃墜時の処理なども共通で良さそうですので、このあたりのプロパティや処理をまとめて基底クラスにしておきます。
様々な敵キャラは、この基底クラスを継承して必要な部分のみ(どういった動きをするか・どのタイミングで弾を発射するかなど)実装していきます。

そして、アイテム。
折角シューティングゲームを作るのであれば、パワーアップアイテムなどがあった方が盛り上がりますね。
直線で飛ぶ弾、広がる弾、誘導ミサイル(弾道の美しい誘導ミサイルは個人的にテンションが上がります!ヒャッホー!!)など、アイテムをとることで色々な弾が撃てるようになるとステキ。
そうそう、ライフが増えるアイテムも忘れずに。

こちらも種類が豊富ですので、敵クラスと同じくアイテムの基底クラスを作り、それを継承して実装していくとまとまると思います。

最後にUI。
さまざまな情報を表示するために、UIも必要です。
今回はとりあえずテキストベースでシンプルに情報を表示する形にしてみます。

重要ポイント:ゲームオブジェクトのレイヤー分け

各種実装に関しては実際にコードを見ていただくとして、Unityのレイヤーをうまく活用すると実装のコード量を減らすことができます。

レイヤーを使うことで「レイヤーAのゲームオブジェクトはレイヤーBのゲームオブジェクトとは衝突させない(すり抜ける)」といった制御が可能になりますので、最初から自機の弾は敵にだけ、敵の弾は自機にだけ当たるようレイヤーで制御してしまえば余計な実装は不要になります。

ゲームオブジェクトのレイヤーはInspector上部から行えます。

レイヤー同士の衝突制御はメニューの Edit->Project Settings->Physics 2D から行えます。
チェックを外すと該当レイヤーのオブジェクト同士が衝突しなくなります。

↑ですと、Playerレイヤーのゲームオブジェクト同士は衝突せず、Enemyレイヤーのゲームオブジェクト同士も衝突しません。
この設定でプレイヤーをPlayerレイヤーに割り当て、プレイヤーが発射するミサイルもPlayerレイヤーに割り当てると、「自分の発射したミサイルにあたって撃沈」といった悲しい事故を回避することができます。

なお、今回は直進する弾はParticle Systemを使って実装しました。
Particle Systemの場合は通常のゲームオブジェクトとは異なり、Collision設定のCollides Withで「Particleが衝突するレイヤー」を指定する形になります。

余談:シューティングゲームを作る時に気をつけたいこと
シューティングは目を酷使するゲームですので、敵・弾・アイテムなどをいかに判別しやすくするかも重要です。
多くのシューティングゲームで弾の色が極彩色(主に赤)をしているのは、プレイヤーに弾を認識してもらいやすくするためです。
やむを得ず視認しづらい色の弾にせざるを得なかったとしても、弾に派手なエフェクトを与えるなどの工夫で、視認性の向上は可能です。
このあたりはプレイヤーに対する思いやりが問われる部分と言えるでしょう。
(視認しづらいシューティングは、それだけでクソゲー呼ばわりされてしまうこともありますので・・・)

遊んでみる

今回もテストプロジェクトを準備してみました。
プレイ動画はこちら。
https://www.youtube.com/watch?v=1Xg4xkOyqR4

プロジェクトは下記からダウンロードできますので、ぜひ一度遊んでみてください。(&実装も見てみてくださいね)
https://github.com/akako/gamealgorithm-shooting-2d

なお、ゲームバランスはメチャクチャですのであらかじめご了承下さい(笑)。

※ゲームで使用しているアイコン類は「ICO0ON MONO」様のものを利用させていただきました。多謝!
http://icooon-mono.com/

まとめ

今回は原点回帰ということで、シューティングゲームを作りました。

シューティングに限らず様々なゲームに言えることですが、敵やアイテムなどカテゴリとして分類できるゲームオブジェクトが多数ある場合は、できるだけそれらの共有部分を見つけ出し、基底クラス化しましょう。
そうすることで、各ゲームオブジェクトのスクリプトは格段にシンプルになります。
メンテナンス性の向上というヤツですね。

また、レイヤーなどの便利な機能を使うことで実装がグッと楽になりますので積極的に活用すると良いでしょう。

次回予告

この流れで次回もアクション系のゲームでいきますよ!

きっとみなさまご存知、見下ろし型アクションのアレ。アレですアレ。爆弾男が爆弾置いてドカンドカンするやつ。

次回はアレっぽいアルゴリズムを実装してみようと思います。

原稿: 賀好 昭仁
qnoteスマホアプリ開発チーム技術主任。PHP・Android・iOS・Unityなど複数のプラットフォームでの開発を行う。
しばしば7匹の先輩猫社員たちにイスを占領される。

Unityで作ろう!ゲームアルゴリズム(7)2Dシューティングのアルゴリズムを作ってみた

この記事はどうでしたか?

おすすめの記事

キャリアを考える

BACK TO TOP ∧

FOLLOW