今回は「Unityを使ったシングルプレイ用FPSの作り方」をテーマに、
- 求められる機能
- 開発の流れ
を整理してみるまとめ記事です。
FPSというと海外では非常に人気のあるジャンルですが、日本ではまだまだ「ゲーマーがやるゲーム」という感じでマイナーです。そして国産のFPSというと数えるほどしかありませんし、ましてや日本人が個人開発したFPSなんて滅多に見かけません。
ただ、姉妹サイト「Unityでゲームを作ろう!」のFPSの作り方講座のアクセスを見てみると意外と閲覧されているので、「FPSを作りたい」と思っている人は一定以上いることがわかります。つまり「作ってみたいけど作り方がよくわからん!」という方が多いのではないでしょうか?
そこでここでは前述の通り、UnityでのFPS開発で作る必要がある機能や開発の流れなどを紹介していきます。
※Unityの機能説明も含めた「具体的な作り方の手順」を知りたい方は、↑の姉妹サイトのほうをご覧ください。
そもそもFPSとは?
まずはじめに、そもそもFPSって何?という部分を簡単に説明しておきます。FPSとは「First Person Shooter」の略で、日本語で言うと「一人称視点シューティング」です。
どんなゲームなのかについては文章で説明しても分かりづらいので、下のゲーム画面の例をご覧ください。
まあ非常にザックリ言うと
- 自分の目線で見たようなゲーム画面で
- 銃を使って敵を倒す
という要素を持った3Dゲームを指すゲームジャンルですね。自分視点なので、プレイヤーキャラは銃と腕くらいしか表示されないのが特徴です。
FPSの開発難易度について
では、ここからFPSを作るというテーマに切り込んでいきましょう。はじめに「FPSは簡単に作れるのか?」という疑問にお答えしておくと、個人的な意見としては
と思っています。
シングルプレイ用のFPSなら簡単に作れる!その理由は?
このように言える理由としては次の3つが挙げられます。
- FPSはアクションゲームに近いから。
→Unityでアクションゲームを作るのは簡単。 - 海外では人気ジャンルなのでアセットが充実しているから。
→ゼロから自作しなくても良い - シングルプレイであればオンラインゲーム開発の知識が必要ないから。
→オンラインゲームを個人開発するのは難しい。
まず一つ目の理由は、FPSはアクションゲームに近いのでUnityで作りやすいからです。Unityは物理演算機能が充実していてアクション要素の強いゲームを作るには最適です。そしてFPSも実質3Dアクションゲームにシューティング要素がくっついたようなものなので割と作りやすいといえます。
次に二つ目はFPS用のアセットが充実しているからです。アセットストアで検索すれば無料のFPSアセットも色々ありますし、お金を出せば高度な機能があるFPSテンプレートを購入することもできます。つまり、一から自分で作らなくても良いというメリットがあります。
最後に三つ目の理由は、シングルプレイFPSならオンラインゲーム開発の知識が不要だからです。これについては↓で説明しますね。
シングルプレイFPSとマルチプレイFPS
何となくわかると思いますが、他のジャンルと同様にFPSにも
- シングルプレイFPS:一人で遊ぶFPS
- マルチプレイFPS:オンラインで多人数で遊ぶFPS
の2種類があります。ゲーム開発の観点から言うと、この2つの大きな違いは次の通りです。
- シングルプレイFPS:
ゲームを面白くするためには敵AIの開発技術が必要。ただし、AIといっても(ゲーム内容にもよるが)簡易的なAIで十分事足りる場合が多い。 - マルチプレイFPS:
対人戦のときはAIは不要だが、オンラインゲーム開発の知識がないと作れない。
先ほども少し書いた通りオンラインゲーム開発は個人だと難しいです(※加えて、仮に作れたとしてもマトモに運営するのはもっと難しい)。なので上のほうでは「シングルプレイ用のFPSなら簡単に作れる」という書き方をしました。
シングルプレイFPSに求められる機能
次に、シングルプレイFPSに求められる機能を整理しておきます。主な機能を挙げると次の通りです。
- 一人称視点のプレイヤーキャラクター
- 弾の発射・リロード
- 武器切り替え・ADS等
- アイテム取得処理
- AIで自動行動する敵キャラクター
一人称視点のプレイヤーキャラクター
まず、FPSというからには一人称視点のプレイヤーキャラクターを作る必要があります。この一人称視点のプレイヤーキャラには、一般的には
- マウス移動=視点移動
- WASD、もしくは方向キー=前後左右に移動
というような動きをさせることが多いです。まあこの辺は文章で書いてもよく分からないと思うので、ピンとこない方は実際にFPSをやってみるのをお勧めします。
もし動きのイメージが分かっていてもスクリプトの書き方が分からない場合は、Unityであればアセットストアにサンプルがあるので、初めての方はそのC#スクリプトを見てみると良い勉強になるのではないかと思います。
自作できそうになければとりあえずサンプルをそのまま使っても良いですし、アセットストアには他にも高度なキャラクターコントローラーがあるので、お財布に余裕がある方はそちらを使ってみるのも一つの手かもしれません。
弾の発射・リロード
次にFPSであれば武器から弾を発射したり、リロードモーションをつけたりしたいものです。そこでその辺について少し詳しくお話しておきましょう。
弾の発射処理について
弾の発射処理の2つの方式
まず、弾の発射処理については有名なやり方が2通りあります。
- Projectile方式:
物理演算で弾を移動させる - Hitscan方式:
レイを飛ばして、レイが当たった地点を着弾地点とする
どちらが良いのかはゲーム内容によりけりですが、よく分からなければとりあえず
- リアルさを追求したいならProjectile方式
- 処理を軽くしたいならHitscan方式
という風に考えてもらえばOKかなと思います。
弾の同時発射数やバラつき等の実装
それから弾の発射については、次の機能(※私は勝手に「シューティング4要素」と呼んでいます)を実装しておくと武器のバリエーションを作りやすくなります。
- 弾の同時発射数
- 弾の発射間隔
- 弾のバラつき具合
- 発射する弾の種類の指定
具体的な例を挙げると、
- アサルトライフル:同時発射数1、発射間隔短め、バラつき小、直進弾
- ショットガン:同時発射数8、発射間隔長め、バラつき大、直進弾
- ミサイル:同時発射数1、発射間隔長め、バラつき無し、追尾弾
というような感じです。このように上記の4つの要素を細かく変更できるようにしておけば、色々な武器を簡単に作ることができるようになるのでお勧めです。
オブジェクトプール
あと、Unityでシューティングゲームを作ったことがある人なら分かると思いますが、弾の発射処理は当然ながら弾をたくさん出せば出すほど重くなります。特に
- Instantiateメソッドで弾をインスタンス化
- 着弾したらDestroyメソッドで消去
というやり方をやると重くなりがちです。そこで「オブジェクトプール」という方法を使って処理を軽くしましょう。
オブジェクトプールとは、簡単に言うとInstantiateとDestroyの呼び出しを必要最小限に抑える方法です。つまり処理内容的には
- とりあえず弾がなければInstantiate
- 着弾したら弾を非アクティブにする
- 非アクティブな弾があるなら、次に弾を発射するときにそれをアクティブ化して再利用する
という感じです。Unityでのオブジェクトプールの実装方法については以下の記事で詳しく説明していますので、併せてご覧いただければと思います。
リロードモーションについて
それからリロードモーションについてですが、こちらは3Dモデルとそのアニメーションの関係なので自作するのは大変だと思います。そしてアセットストアを探してもその辺のアセットはそこまで多くないし、基本的に改造が難しかったりするようなのでなかなか思い通りにならないかもしれません。
なので個人的な意見としては、実装が大変なわりに必須というほどの機能でもないし、リロードモーションは設定しなくても特に問題ないのではないかと思います(※もちろんカッコいいリロードモーションはFPSの一番の見どころなのは十分承知していますが…)。
※追記:
どうしてもリロードモーションを導入したいという方のために、アセットストアで好評のFPS用リロードアニメーション素材を掲載しておきます。よかったら参考になさってください(ただしいずれも改造が難しいとのレビューがあります)。
武器切り替え・ADS等
次に可能なら盛り込みたい機能として、武器の切り替えやADS(=Aim Down Sight。照準を覗きこんで狙うこと)が挙げられます。
武器切り替え処理について
まず武器切り替え処理については、複数の武器が登場するFPSなら必ずつけておきたい機能だと思います。これは実装はそんなに難しくなくて、武器のゲームオブジェクトが登録されたリストを作っておいて、マウスホイールを転がしたときに順次切り替える(=前の武器を非アクティブにして、次の武器をアクティブ化する)、といった処理でOKだと思います。
ADSについて
次にADS機能については、ボタンを押したら銃を正面に移動させてスコープをのぞき込むような位置に持ってくればOKです。ただしスナイパーライフルなどスコープがある武器の場合は、
- カメラを滑らかにズームさせる
- スコープのUIを作って表示する
などの工夫が必要です。
アイテム取得処理
あとはFPSに限ったことではありませんが、アイテムの取得処理も実装しておきたいものです。FPSであれば主に次の2つのアイテムがあれば良いと思います。
- 弾薬補給アイテム
- 回復アイテム
アイテムの取得処理はそれほど難しくなくて、
- プレイヤーに接触したかどうかの判定
- プレイヤーに接触したときの弾やHPの増減
といった処理を書ければ十分でしょう。
AIで自動行動する敵キャラクター
最後に、シングルプレイFPSを面白くするためにはAIで自動行動する敵キャラクターが欠かせません。
この辺についての知識は以下の記事
に詳しく書いたので、そちらをご覧いただければと思います。
ただまあ、AIを作るのは初心者の方には結構難しいと思いますので、UnityでFPSを作るのであれば最低限NavmeshAgentの使い方を覚えて、「プレイヤーを追いかける敵キャラクター」を作れるようになればOKだと思います。
FPS開発の流れ
さて、それではこの辺でFPS開発の流れを簡単に紹介しておきます。工程としては次のような感じになります。
- 一人称視点のプレイヤーキャラクター作成
- 弾の発射処理の作成
- 武器切り替え・ADSの実装
- ゲームの裏方部分の実装
- アイテムや敵キャラクター作成
- ステージ制作
- テストプレイ&ビルド
まずはプレイヤーキャラクターから作り始めて、弾を発射できるようにするのが先決です(1・2・3番)。この辺の作業は超地味ですが操作感に直結し、ゲームの面白さに大きく影響するのでなるべく手を抜かないようにしましょう。
そうしたら、次にゲームの裏方部分を作ってしまいます(4番)。ゲームオーバー処理やクリア処理など、いわゆる「ゲームループ」を回せるようにしておきましょう。
それができたらアイテムや敵キャラクターを作ります(5番)。敵キャラクターを作るのは大変だと思うので、必要以上に種類を増やそうとしないのがポイントです。
ここまでできたら後はステージを作るだけですね(6番)。こちらも大変な作業ですがシングルプレイFPSではステージ構成(=レベルデザイン)も面白さに大きく影響するので頑張りましょう。
最後にテストプレイしてバグや分かりづらい箇所がなければビルドして完成です(7番)。
おわりに:FPSを作るのは楽しいぞ!
以上、かなり長くなってしまいましたがFPSの作り方を詳しくまとめてみました。ここまで読んで頂ければ必要な機能や開発の流れが分かったと思うので、作り方のイメージがなんとなく見えてきたのではないでしょうか。ここからさらに進んで具体的な作り方を知りたい場合は、姉妹サイト「Unityでゲームを作ろう!」のFPSの作り方講座のほうを併せてご覧いただければ良いかと思います。
私はここ1年くらい地道にFPSシステムを作りこんでいるのですが、FPSを作るのはそこまで難しくないし、何より楽しいのでもっと色々な方にFPSの開発にチャレンジしてほしいと思います。みんなでマイナーな「自作FPS」というジャンルを開拓していければ楽しそうですね。
この記事を通してFPS作りに興味を持っていただければ幸いです。