一人称コントローラーの作り方/FPSやホラーゲームなど

一人称視点のゲームは数多く存在します。脱出ゲームやシューターゲームなど利用場所が多いです。ここではその基礎になるFPSのコントローラーを作ってみましょう(ただしシューター要素はないです)

どんなゲームが作れるの?

ここで想定しているものとしてはFPSと言いつつ、一人称のコントローラーを作成します。

完成品のイメージ

下図は無料のアセットの中を歩かせてみました。ホラーゲームなどでよく利用される機能を実装しています。ドアを開けたりアイテムを取得したりすることが出来ます。簡単な脱出ゲームなら作れそうですね!(画質の問題で映像が見づらくてすいません)

  • 視点起動
  • キャラクター移動
  • インタラクション
    • ドアの開閉
    • ものを取る
    • スイッチをつけるなど
  • しゃがみ
  • 条件分岐
    • 所持アイテムの有無
    • 明るさなど
スライム

ホラゲーのサンプルとして暗がりのゲームを作ったんですが、全体的に映像が暗くて見づらいですね、すいません。

コンポーネントの着脱

今回は一つのスクリプトにあらゆる機能を追加するのではなく、機能ごとにスクリプトを作成し、メインになるスクリプトから各機能を利用する形式を取ります。

これによりゲームによって不要な機能を使わない場合は追加しないことで機能制限を行うことが出来ます。

スライム

コンポーネント単位で機能を作る方法は、他でも役に立ちます。クラス単位で機能をもたせるというのもオブジェクト指向っぽくてオススメです!

コア部分の作成

では実際に作っていきましょう!まずはほとんどのFPSで使われそうな主要な機能を作っていく予定です。

設計方針

今回はちょっと特殊な作り方を行おうと思います。いかにもUnityらしいというかオブジェクト指向というか、コンポーネントの着脱によって機能したりしなかったりするような作りになります。有名どころだとMore Mountainsさんなんかも似たような作りの部分があったりします。

下図はコントローラーのルートのインスペクターです。たくさんコンポーネントがくっついていますが、それぞれ独立した機能ごとにスクリプトを分けています。

頭を揺らす機能がいらない場合はHeadbobを外せばいいし、しゃがむ機能がいらないのであればCrouchを外せばよい、そんな感じの構成になっております。

作業手順

  1. Part1. プロジェクトの作成!
    • 3Dのプロジェクト
    • 今回は素材などはなし
  2. Part2. FirstPersonControllerの基本!見渡す処理を作ろう!
    • 見回し処理は基本処理に追加します
  3. Part3. 移動処理の実装!CharacterControllerとの連携
    • 移動させるための処理はCharacterControllerを利用します
    • 他の移動方法とは少し異なるので利用には注意が必要
    • 今後の手間を考慮して、ベースクラスと継承を利用!
  4. Part4. ダッシュ!Sprintとも言われたりする
    • 他のコンポーネントに依存するコンポーネントを作成します
    • Movementありきでの実装例
  5. Part5. ジャンプ!
    • ジャンプ処理は移動と関連性が高いため、Movementの中に組み込みます
  6. Part6. しゃがむ処理を実装
    • しゃがみ用のコンポーネントを用意。このあたりから追加コンポーネントと関連処理の実装が行われます
  7. Part7. 頭の揺れ(Head Bob)を追加
    • あるとそれっぽい雰囲気が出るので、追加は好みに合わせてどうぞ!
  8. Part8. ゲームに干渉するインタラクション!
    • インターフェースを使って実装
    • サンプル:アイテムを取得する

オプショナル機能の実装

基本的な実装が出来たところで、ここからはゲームによって必要なものを追加していってください。コンポーネントごとに基本独立しているので、気になる項目

各実装項目

  • Part9. スロープ滑っておりる
    • ゲームによっては坂道でとどまらずに滑って欲しい
    • ジャンプを駆使して坂を無理やり登られると困るようなゲームデザインの場合は必要
  • Part10. ズーム機能、ADSなどを行う
    • スコープで覗いた時や、目を凝らした時なんかの演出
  • Part11. ドアを開ける・閉じる
    • インタラクションの応用その1
    • ドアを選択して開けたりしてみましょう。
  • Part12. 別のオブジェクトに干渉する・電気をつけるなど
    • インタラクションの応用その2
    • 電気をつけたり、対象のオブジェクト以外へのイベントを起こす処理