FPSを作ってみよう1-FirstPersonCharacterを使ってみる-

今回から『FPSを作ってみよう』というカテゴリを作り、少しづつFPSゲームを作っていく記事を作成したいと思います。
FPSを作りたい方が結構いるみたいです(わたくしの勝手な推測を含む)。

FPSってFirstPersonShooterの略だったんですね、FirstPersonShootingだと思ってました。
あれ?違う?(^_^;)

今までの記事では、機能毎に新しくスクリプトを作成していたので、少しづつ作りたい人には少し不便だったかもしれません。

と言っても、すべての記事を段階的に作成していく記事にするわけでなく、FPSに関してだけカテゴリを分けて作ってみようと思います。

FPS以外のゲームの機能に関しては、今まで通りです。

あらかじめ言及しておきますが、ゲーム作り初心者向けになります。
機能を追加していくスピードもゆっくり進み、いきなり難しくならないようにしていきたいと思います。

ある程度ゲームっぽい感じに仕上げたいところですが、いかんせんわたくし自身がFPSが作れるかどうかわかりませんので、どの程度まで作れるかわかりません。

また、このカテゴリ以外の記事内容へのリンクがあり、その内容を理解する必要が出てくる項目も多々ありますのでご了承ください。
わたくしの能力不足で先に進まない事もありえます(+_+)

これだけ言い訳を入れておけば途中で投げ出しても許してもらえるかな・・・・(^_^;)

スポンサーリンク

Standard AssetsのFPSControllerを設置する

UnityのStandard Assets内にあるFPSControllerは、FPSを作る時に必要なキャラクターの機能を搭載しているので、これをキャラクターモデルに設定すればキーボードとマウスを使った主人公キャラクターの移動や視点変更、ジャンプ等の機能が使えます。

ただスクリプトがC#で書かれている所、当ブログではJavaScriptでスクリプトを書いている所(今はC#へと完全に切り替えました)、
スクリプトを変更する時に、既存のスクリプトを解析しなければいけない点を踏まえてこの機能は使いません。
今回はFPSの動きを確認する為に使用します。

もちろんFPSControllerを使って改造していくのもいいと思います。
というかFPSの機能を標準で搭載してくれてるのに使わない方がもったいない気もしますが・・・・(^_^;)
わたくしは一から作っていく事にします。(^_^)/

まずは、Unityのインストール時に入っているStandard AssetsのFPSの機能を使って動きを確認してみます。

Unityインストール時にStandard Assetsのチェックを入れなかった人は、UnityからStandard AssetsをダウンロードするかAsset Storeからもダウンロード出来ます。

FirstPersonCharacter

Assetsフォルダの

Standard Assets→Characters→FirstPersonCharacter→Prefabs→FPSController

をヒエラルキーにドラッグ&ドロップしてください。

RigidBodyFPSControllerというのもありますが、こちらはRigidbodyとCapsuleColliderを使ってキャラクターを移動させ、
FPSControllerはCharacterControllerを使ってキャラクターを移動させます。

Unityではキャラクターを動かす時にRigidbody+コライダ、またはCharacterControllerを使います。
なのでどちらを使ってもOKです。

多少違いはありますが、わたくしの場合CharacterControllerを使ってキャラクターを動かします。

FPSControllerを見るとCharacterControllerの他にRigidbodyも取り付けてあり混乱しますが、とりあえずここでは気にせずいきましょう。

(基本的にはゲームオブジェクトを動かす場合はRigidbodyを取り付けておきます)

FirstPersonCharacterのインスペクタ

ヒエラルキーに設置したFPSControllerを選択するとインスペクタに↑のように表示されます。

TransformのYを2に設定しておきます。
これはキャラクターをステージに登場させた時に、ステージにめり込まないように少し上から登場させる為です。

FirstPersonControllerコンポーネントの項目でパラメータを変更するとキャラクターの動きを変更出来ます。

FPSControllerの設定

Is Walkingは現在歩いているかどうか?のフラグです。
Walk Speedは歩くスピード。
Run Speedは走るスピード。
Runstep Lengthtenは走っている時の足を付く速さを指定します。高い数値を指定するとカメラの上下動が早くなります。
Jump Speedはジャンプ力。
Stick To Ground Forceは地面の方向にY座標の値を足して、確実に設置させる為の数値みたいです。
Gravity Multiplierは重力値の計算をする時の補正値?

MouseLookはマウスでの視点変更のパラメータです。

XSensitivityは横向きの移動速度。
YSensitivityは縦向きの移動速度。
Clamp Vertical Rotationにチェックを入れると視点の限界角度を設定します。
Minimum Xは縦方向の最小角度。
Maximum Xは縦方向の最大角度。
Smoothにチェックを入れると視点の動きがスムーズに動くようになります。
Smooth Timeはスムーズに遷移する時の速さ。
Lock Cursorにチェックを入れるとゲーム中にマウスカーソルを非表示にします。

Use Fov KickはカメラのFieldOfViewを変更するかどうか?みたいですがよくわかりません。
Fov Kickの項目もよくわかりません。

Use Head Bobは歩きを表現する為にカメラを上下に振るかどうかです。
Horizontal Bob Rangeは横に振る時の長さ。
Vertical Bob Rangeは縦に振る時の長さ。
Bob Curveはグラフで表したカメラの動きの基本値。
Verticalto Horizontal Ratioは上下に動く間隔。

Jump Bobはジャンプの時のカメラの上下動についてです。
Bob Durationはカメラの上下動にかかる時間。
Bob Amountはカメラの上下動の幅。

Step Intervalは足音を鳴らす間隔です。
Footstep Soundsは足音、ジャンプ、着地時の音声を指定します。

一部わからないパラメータもありますが、解析した結果はこんな感じになります。

FPSControllerの動きを確認する前にキャラクターが移動する土台を作ります。
ヒエラルキー上で右クリックし3D Object→Cubeを選択し、名前をYukaと変更します。

床のインスペクタ

Yukaを選択するとインスペクタは↑のようになります。
TransformのXとZを100に設定します。
これでFPSControllerが移動する床の作成が完了しました。

FPSControllerを使って床の上の移動を確認する

それでは、FPSControllerの機能を使って床の上を移動させてみましょう。

ここでキャラクターと言わずFPSControllerと言っているのは、キャラクターモデルにFPSControllerを取りつけていないからです。

キャラクターモデルは視覚的に必要ですが、床との当たり判定や移動等はFPSControllerが行っているので、キャラクターモデルがなくても問題ありません。

それではUnityの実行ボタンを押してください。

キャラクターの移動はA(左)、W(前)、S(後)、D(右)または↑↓←→のキーで移動出来ます。
左Shiftキーを押しながら移動キーを押すと走ります。

キャラクターの向きはマウスで向きを変えるので、移動キーで左に移動してもマウスを動かさなければ、前方を向いたまま左に移動するカニ歩きになります。
またSpaceキーを押すとジャンプします。

またUnityの実行ボタンを押すと、マウスカーソルが非表示になるので、実行を停止する事が出来なくなります。
マウスカーソルを表示させるにはEscキーを押してください。

いきなりマウスカーソルが消えると焦りますが、Escキーを押すと表示されると言う事を覚えておいてください。

FPSControllerの動きの確認

↑が実行例です。

上の例では、Sceneタブで確認しているので3人称視点になっていますが、Gameタブで実際の画面を確認すると1人称視点になっている事がわかります。

キャラクターが動くとカメラが上下に動きキャラクターの目の動きを表現してますね。
FPSではカメラがキャラクターの目になるので、こういった演出も必要になりますね・・・・大変そう((+_+))

また、マウス操作で視点を変更するとキャラクターの向きが変わりますが、FPSControllerでは

FPSControllerを設置したヒエラルキー

↑のようにFPSControllerの子要素に、FirstPersonCharacterがあり、そこにカメラが設置されています。

マウスの動きで横を向いた時は、親要素のFPSControllerのY軸の角度を変更し、マウスの動きで上下を向いた時は子要素のFirstPersonCharacterのX軸の角度を変更しています。
移動方向は親要素で、視点の方向は子要素にしています。

親要素のX軸の角度を変更すると、移動キーを押した時に空中の方向に歩いていこうとする為、おかしい動作になってしまうのかも。
移動方向と視点の方向は別にするってことですね。

ここら辺の機能を作成する時は参考にしよう(-.-)

次回から作っていくFPSの機能について

さて、今回はUnityに標準装備されているFPSControllerを使って動きを確認してみました。

これから自前でキャラクターの動きを作成していくので、ある程度どのような動きにするか知っておく必要があるので、FPSControllerを使ってみましたが、
一から作成すると色々大変そうですね・・・(^_^;)

次回はAsset Storeでキャラクターをダウンロードして、キャラクターの移動の機能を取りつけるところまでやってみようと思います。

以前の記事で、キャラクターの移動の機能は作っているので、スルーしておきたいところですが、再確認と言う意味も込めてまた作ってみましょう。
2度手間な気がしますが・・・・。

あぁ・・・ある程度機能を完成させてから記事を書き始めればよかった・・・・(^_^;)
機能が出来るかわからない状況でカテゴリまで作ってしまった(-_-)

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます

コメント

  1. 匿名 より:

    主人公は移動せずマウスの視点移動だけで遊ぶゲームを作りたいと思っています。
    自前でカメラのスクリプトを組む実力はないので、FPScontrollerを利用しようと思ったのですが、水平方向に角度制限(左右90度)を設けることはできるのでしょうか。

    最初のrotationのY座標が180になっているので、一応、上記のコードでおおむね実現できるのですが、一つ問題があります。例えば、マウスを動かし続けるとしばらくrotationは270度になるので支障はないのですが、ある程度のところで視点が急に左側(rotationが90度)に切り替わってしまいます。これを防ぎたいです。
    回転角かマウスのGetAxisの関係かと思いましたが、結局解決に至りませんでしたので質問いたします。。
    お手数をおかけしますがよろしくお願いいたします。

    • こんにちは(^^)/

      回転に制限を加えるのはわたくしも以前やったことがあるので苦労しました(うまく出来たとは言えませんが・・・)。

      Unityの回転は内部的にはクォータニオンで保存しているので、Transformのオイラー角を参照し、その値を書き換えてそれをクォータニオンに変換して再設定してもジンバルロックが発生し正しい回転を計算出来ない可能性があります。

      わたくしの記事でもこういった操作を行っているスクリプトが多々あり、修正の必要がありますが・・・・・(^_^;)

      回転についてはUnityマニュアルの回転と向きのページに詳細が書いてあり、間違った使用方法についての例も載っております。

      https://docs.unity3d.com/jp/current/Manual/QuaternionAndEulerRotationsInUnity.html

      回転の計算についての注意は上記のUnityマニュアルのページを参照してください。

      それは置いておきまして。(/・ω・)/

      FPSControllerをそのまま使用するのであれば横軸の回転の制限も結構簡単に出来ます(内部処理を把握する必要がない為)。

      FPSPersonControllerスクリプトから使用しているMouseLookスクリプトが視点の上下やキャラクターの横の回転を行っており、上下の制限処理が既にそこに書かれているのでそれを少し修正します。

      MouseLookスクリプトを修正します。

      まずは制限角度のフィールドを用意します。

      次にClampRotationAroundXAxisメソッドを丸々コピーして下に貼り付け、ClampRotationAroundYAxisというメソッド名に変えます。

      ClampRotationAroundXAxisはキャラクターの視点の上下を制限するメソッドなのでそれをコピーしています。

      angleX変数をangleY、Atan等のq.xをq.y、に書き換えます。

      最後にClampRotationAroundYAxisメソッドを呼び出す処理をLookRotationメソッドの中に追加します。

      こうすることでキャラクターの横回転にも制限を加える事が出来るようになります。

      • 匿名 より:

        返事が遅くなり申し訳ありません。
        クォータニオン等回転の仕組みは以前調べてみたことがありますが「なるほど、わからん。」でお手上げ状態でした。。いずれはしっかり理解したい所存です。。。
        ともあれ、解決策を教えていただきありがとうございます。早速試してみたいと思います!

  2. 匿名 より:

    FPS作っているんですが、キャラクターにFPS Controllerをくっつけて移動させることはできるんですか?
    2と3の方法でスクリプト書いたりMainCameraの位置を目線に合わせたり、アニメーションを追加しましたがキャラクター自体はIdleのまま一向に動いてくれません。

    • FPSControllerのプレハブ自体ではコライダとキャラクターの移動処理を書いたスクリプトが設定されていますが、アニメーターコントローラーを操作する処理が書かれていません。

      この記事のわたくしの文章でキャラクターにFPS Controllerを取り付ければ動かせますと書いていますが、厳密に言うとFPS Controllerの子要素のFirst Person Characterの階層下にキャラクターモデルを配置しモデルの位置をカメラ位置と合わせます。

      例えばEthanをキャラクターモデルとして配置する時は

      FPSControllerの階層下にキャラクターモデルを配置

      ↑のような階層になります。

      この状態でキーボードの十字キーやマウスを使って視点変更を行うと

      FPSControllerの階層下にキャラクターモデルを配置して動かす

      ↑のような感じでカメラの動きに合わせてキャラクターの向きが変わります。

      FPSなので自身のキャラクターがこのように回転しても問題ありません(自分では銃を撃つときの手だけが見えていれば良い為)が、オフラインで対戦出来るようにしたり、オンライン対応した時にこのようにキャラクターが動いているのが見えると問題なのでそれはそれで対処する必要があります。

      キャラクターが移動やジャンプをした時にアニメーションをさせるには、キャラクターのAnimatorにAnimatorControllerを作って取り付け、FPS Controllerに既に取り付けてあるFirst Person Controllerというスクリプトの処理の中にキャラクターに取り付けたアニメーターコントローラーを操作する処理を自分でスクリプトを書いていき、アニメーションを変化させる必要があります。

      わたくしの場合このスクリプトを改造するのが大変そう(わたくしの場合は人の作ったスクリプトを改造するより一から作る方が向いている為)なので「FPSを作ってみよう2」の記事から自分でスクリプトを実装していってます。

      FPS Controllerを使った処理はUnityのライブトレーニングのMike Geigさんのオンライン対応のFPS作成の動画が非常に参考になります。

      こちらはカプセル形状に銃を持たせたままの実装です(オンライン対応にPhotonを使用)。

      https://unity3d.com/jp/learn/tutorials/topics/asset-store/merry-fragmas-multiplayer-fps-part-1

      こちらは通常の人型モデルを使った実装です(オンライン対応にUNETを使用)。

      https://unity3d.com/jp/learn/tutorials/topics/multiplayer-networking/merry-fragmas-30-multiplayer-fps-foundation?playlist=29690

      人型モデルを使っていますが、First Person Characterの子要素にモデルを配置せず、視点変更時はキャラクターは回転させない仕様になっています。

      どちらの動画もシリーズもの?で2時間近くの動画がそれぞれ3つありFPSを作っていきます。

      FPS ControllerでFPSを作っていく時はこちらの動画が非常に参考になりますよ。(^^)v

      • 匿名 より:

        ありがとうございます!
        そういうことだったんですね。
        一応オンライン向けにしようと思ってるのでこの記事を参考にしてみます!
        詳しい説明ありがとうございます。

  3. Kshi より:

    FPSControllerのプログラムがうまく作動しません
    どうしたら良いでしょうか?

    • こんにちは(^^)/

      FPSControllerのプログラムがうまく作動しませんというだけでは、どういったところでうまく作動?動作?しないかの詳細がわからない為、返答のしようがありません・・・(^_^;)

      FPSControllerのプレハブをヒエラルキーに配置出来ない。
      配置したけどキーボードの移動キーを押しても動かない。
      マウスで視点変更出来ない。
      コンソールに何らかのエラーが出て実行出来ない、スクリプトのエラーでコンパイルが出来ていない(どんなエラーが出ているのか)
      以前は動いていたが、パラメータの変更等をしたら動かなった(変更した部分)
      プログラムを書き換えてしまって動かなくなった(書き換えたとしたらどう書き換えたのか?)

      詳細を書いて頂くと返答がしやすいです。

      • Kshi より:

        コンソールのエラーで実行ができません!
        (説明不足ですみませんm(__)m)

        • どのようなエラーがコンソールに表示されているのかわかれば解決のお手伝いが出来るかもしれません。

          • Kshi より:

            自分でも何でエラーが出ているのかわからないので
            Unityのバージョンを変えてやってみます。
            いろいろ迷惑かけてすみません_(._.)_

  4. RN より:

    すいません、FPSControllerのカメラ操作をマウスではなく自動で追尾し常にキャラが向いてる向きにさせることって可能ですか?

    • FPSControllerの設定はあまり見てなかったので試しにやってみました。

      キーボードの↑↓←→だけで前進・後退・左右移動するだけでマウスの動きで視点が動かなければいいんですよね?

      FPSControllerに設定されているFirst Person Controllerスクリプトの設定で

      Mouse Lookの中のX Sensitivityを0にすると横の視点移動がなくなり、Y Sensitivityを0にすると縦の視点移動がなくなるみたいです。

      • RN より:

        その操作でカメラはマウスで動かなくなりましたがそこから自動追尾のカメラを設定するのはどのようにすればいいのでしょうか?

        • 自動追尾というのは主人公が敵キャラに近付いたらカメラ(主人公キャラ)の向きを敵キャラの方に向かせるという事でしょうか?

          でしたら

          https://gametukurikata.com/program/rotateenemy

          で攻撃の構えをした時に一番近くの敵の方向を向くという機能を作成しているので、これを応用すればFPSControllerでも使えると思います。

          詳しい仕様を教えて頂ければわたくしの方で機能の作成をしてみます(出来るかどうかはわかりませんが・・・)。

        • ご希望の動作になっているかわかりませんが作成してみました。

          本日公開した記事

          https://gametukurikata.com/program/rotatetowards

          を少し改造します。

          まずFPSControllerに設定されているFirst Person Controlerスクリプトを修正します。

          Updateのすぐ後でRotateViewという関数を呼んでいると思うのですが、これをコメント化します。

          このRotateViewがマウスで視点を操作している処理になります。

          FPSControllerには新しくRotateDirectionというスクリプトを作り取りつけます。

          次にFPSControllerの子要素に空オブジェクトを作成し、それにコライダを取りつけサーチエリアとします。

          それにSearchTargetスクリプトを作り取りつけます。

          ターゲットを向いた後に戻す時は必ずVector3の前方向になります。

          FPSControllerで自動で敵をサーチサンプル

          ↑のような感じで敵が範囲内にいる時にマウスの右ボタンを押したらそちらを向くようになりました。

          ボタンを押さずにそちらを向かせるにはマウスの右ボタンを押した条件を外します。

          複数の敵の対応や向きを標準に戻す時に必ず同じ方向を向いてしまうというのは対処が必要かもしれません。

  5. 匿名 より:

    すいません、この「FPSを作ってみよう」のTPSバージョンをやってほしいです。
    お願いできますでしょうか?