Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。21今回から『FPSを作ってみよう』というカテゴリを作り、少しづつFPSゲームを作っていく記事を作成したいと思います。FPSを作りたい方が結構いるみたいです(わたくしの勝手な推測を含む)。FPSってFirstPersonShooterの略だったんですね、FirstPersonShootingだと思ってました。あれ?違う?(^_^;)今までの記事では、機能毎に新しくスクリプトを作成していたので、少しづつ作りたい人には少し不便だったかもしれません。言っても、すべての記事を段階的に作成していく記事にするわけでなく、FPSに関してだけカテゴリを分けて作ってみようと思います。FPS以外のゲームの機能に関しては、今まで通りです。言及しておきますが、ゲーム作り初心者向けになります。機能を追加していくスピードもゆっくり進み、いきなり難しくならないようにしていきたいと思います。ある程度ゲームっぽい感じに仕上げたいところですが、いかんせんわたくし自身がFPSが作れるかどうかわかりませんので、どの程度まで作れるかわかりません。このカテゴリ以外の記事内容へのリンクがあり、その内容を理解する必要が出てくる項目も多々ありますのでご了承ください。Assets内にあるFPSControllerは、FPSを作る時に必要なキャラクターの機能を搭載しているので、これをキャラクターモデルに設定すればキーボードとマウスを使った主人公キャラクターの移動や視点変更、ジャンプ等の機能が使えます。スクリプトがC#で書かれている所、当ブログではJavaScriptでスクリプトを書いている所(今はC#へと完全に切り替えました)、スクリプトを変更する時に、既存のスクリプトを解析しなければいけない点を踏まえてこの機能は使いません。今回はFPSの動きを確認する為に使用します。FPSControllerを使って改造していくのもいいと思います。いうかFPSの機能を標準で搭載してくれてるのに使わない方がもったいない気もしますが・・・・(^_^;)わたくしは一から作っていく事にします。AssetsのFPSの機能を使って動きを確認してみます。Storeからもダウンロード出来ます。Assets→Characters→FirstPersonCharacter→Prefabs→FPSControllerをヒエラルキーにドラッグ&ドロップしてください。RigidBodyFPSControllerというのもありますが、こちらはRigidbodyとCapsuleColliderを使ってキャラクターを移動させ、FPSControllerはCharacterControllerを使ってキャラクターを移動させます。Unityではキャラクターを動かす時にRigidbody+コライダ、またはCharacterControllerを使います。どちらを使ってもOKです。多少違いはありますが、わたくしの場合CharacterControllerを使ってキャラクターを動かします。FPSControllerを見るとCharacterControllerの他にRigidbodyも取り付けてあり混乱しますが、とりあえずここでは気にせずいきましょう。(基本的にはゲームオブジェクトを動かして他のゲームオブジェクトに力を加えたい場合はRigidbodyを取り付けておきます)ヒエラルキーに設置したFPSControllerを選択するとインスペクタに↑のように表示されます。TransformのYを2に設定しておきます。これはキャラクターをステージに登場させた時に、ステージにめり込まないように少し上から登場させる為です。FirstPersonControllerコンポーネントの項目でパラメータを変更するとキャラクターの動きを変更出来ます。Walkingは現在歩いているかどうか?のフラグです。Speedは歩くスピード。Speedは走るスピード。Lengthtenは走っている時の足を付く速さを指定します。高い数値を指定するとカメラの上下動が早くなります。Speedはジャンプ力。Forceは地面の方向にY座標の値を足して、確実に設置させる為の数値みたいです。Multiplierは重力値の計算をする時の補正値?MouseLookはマウスでの視点変更のパラメータです。XSensitivityは横向きの移動速度。YSensitivityは縦向きの移動速度。Rotationにチェックを入れると視点の限界角度を設定します。Xは縦方向の最小角度。Xは縦方向の最大角度。Smoothにチェックを入れると視点の動きがスムーズに動くようになります。Timeはスムーズに遷移する時の速さ。Cursorにチェックを入れるとゲーム中にマウスカーソルを非表示にします。KickはカメラのFieldOfViewを変更するかどうか?みたいですがよくわかりません。Kickの項目もよくわかりません。Bobは歩きを表現する為にカメラを上下に振るかどうかです。Rangeは横に振る時の長さ。Rangeは縦に振る時の長さ。Curveはグラフで表したカメラの動きの基本値。Ratioは上下に動く間隔。Bobはジャンプの時のカメラの上下動についてです。Durationはカメラの上下動にかかる時間。Amountはカメラの上下動の幅。Intervalは足音を鳴らす間隔です。Soundsは足音、ジャンプ、着地時の音声を指定します。一部わからないパラメータもありますが、解析した結果はこんな感じになります。FPSControllerの動きを確認する前にキャラクターが移動する土台を作ります。Object→Cubeを選択し、名前をYukaと変更します。Yukaを選択するとインスペクタは↑のようになります。TransformのXとZを100に設定します。これでFPSControllerが移動する床の作成が完了しました。FPSControllerを使って床の上の移動を確認するそれでは、FPSControllerの機能を使って床の上を移動させてみましょう。ここでキャラクターと言わずFPSControllerと言っているのは、キャラクターモデルにFPSControllerを取りつけていないからです。キャラクターモデルは視覚的に必要ですが、床との当たり判定や移動等はFPSControllerが行っているので、キャラクターモデルがなくても問題ありません。それではUnityの実行ボタンを押してください。キャラクターの移動はA(左)、W(前)、S(後)、D(右)または↑↓←→のキーで移動出来ます。左Shiftキーを押しながら移動キーを押すと走ります。キャラクターの向きはマウスで向きを変えるので、移動キーで左に移動してもマウスを動かさなければ、前方を向いたまま左に移動するカニ歩きになります。Spaceキーを押すとジャンプします。Unityの実行ボタンを押すと、マウスカーソルが非表示になるので、実行を停止する事が出来なくなります。マウスカーソルを表示させるにはEscキーを押してください。マウスカーソルが消えると焦りますが、Escキーを押すと表示されると言う事を覚えておいてください。上の例では、Sceneタブで確認しているので3人称視点になっていますが、Gameタブで実際の画面を確認すると1人称視点になっている事がわかります。キャラクターが動くとカメラが上下に動きキャラクターの目の動きを表現してますね。FPSではカメラがキャラクターの目になるので、こういった演出も必要になりますね・・・・大変そう((+_+))また、マウス操作で視点を変更するとキャラクターの向きが変わりますが、FPSControllerでは↑のようにFPSControllerの子要素に、FirstPersonCharacterがあり、そこにカメラが設置されています。マウスの動きで横を向いた時は、親要素のFPSControllerのY軸の角度を変更し、マウスの動きで上下を向いた時は子要素のFirstPersonCharacterのX軸の角度を変更しています。移動方向は親要素で、視点の方向は子要素にしています。親要素のX軸の角度を変更すると、移動キーを押した時に空中の方向に歩いていこうとする為、おかしい動作になってしまうのかも。移動方向と視点の方向は別にするってことですね。ここら辺の機能を作成する時は参考にしよう(-.-)次回から作っていくFPSの機能についてさて、今回はUnityに標準装備されているFPSControllerを使って動きを確認してみました。Storeでキャラクターをダウンロードして、キャラクターの移動の機能を取りつけるところまでやってみようと思います。以前の記事で、キャラクターの移動の機能は作っているので、スルーしておきたいところですが、再確認と言う意味も込めてまた作ってみましょう。2度手間な気がしますが・・・・。14:04初めまして、私は現在スマホのジャイロ機能を用いたFPSを作っているんですが、FPSコントローラに別途ジャイロを機能をつけようとするとうまく動きません。視点移動はするが、移動ができないことが多いのです。14:54こんにちは。パッケージを見てもAdsとかそういうのしかなくて、fpsコントローラーとかビークル(車)とかのパッケージが見つかりませんが・・。Unityって、ずいぶん変わったんですね・・・。11:53AssetStoreからStandardAssetsが入手できるようになっています。Unityインストール時に細かいチェックボックスを付けていれば、確かImportAssetsから従来のように導入できたと思いますが・・・うろ覚えなので間違っていたらすみません。00:39主人公は移動せずマウスの視点移動だけで遊ぶゲームを作りたいと思っています。自前でカメラのスクリプトを組む実力はないので、FPScontrollerを利用しようと思ったのですが、水平方向に角度制限(左右90度)を設けることはできるのでしょうか。90;}最初のrotationのY座標が180になっているので、一応、上記のコードでおおむね実現できるのですが、一つ問題があります。マウスを動かし続けるとしばらくrotationは270度になるので支障はないのですが、ある程度のところで視点が急に左側(rotationが90度)に切り替わってしまいます。回転角かマウスのGetAxisの関係かと思いましたが、結局解決に至りませんでしたので質問いたします。お手数をおかけしますがよろしくお願いいたします。19:45こんにちは(^^)/回転に制限を加えるのはわたくしも以前やったことがあるので苦労しました(うまく出来たとは言えませんが・・・)。Unityの回転は内部的にはクォータニオンで保存しているので、Transformのオイラー角を参照し、その値を書き換えてそれをクォータニオンに変換して再設定してもジンバルロックが発生し正しい回転を計算出来ない可能性があります。わたくしの記事でもこういった操作を行っているスクリプトが多々あり、修正の必要がありますが・・・・・(^_^;)回転についてはUnityマニュアルの回転と向きのページに詳細が書いてあり、間違った使用方法についての例も載っております。https://docs.unity3d.com/jp/current/Manual/QuaternionAndEulerRotationsInUnity.html回転の計算についての注意は上記のUnityマニュアルのページを参照してください。それは置いておきまして。(/・ω・)/FPSControllerをそのまま使用するのであれば横軸の回転の制限も結構簡単に出来ます(内部処理を把握する必要がない為)。FPSPersonControllerスクリプトから使用しているMouseLookスクリプトが視点の上下やキャラクターの横の回転を行っており、上下の制限処理が既にそこに書かれているのでそれを少し修正します。MouseLookスクリプトを修正します。制限角度のフィールドを用意します。45f;次にClampRotationAroundXAxisメソッドを丸々コピーして下に貼り付け、ClampRotationAroundYAxisというメソッド名に変えます。ClampRotationAroundXAxisはキャラクターの視点の上下を制限するメソッドなのでそれをコピーしています。angleX変数をangleY、Atan等のq.xをq.y、に書き換えます。q;}最後にClampRotationAroundYAxisメソッドを呼び出す処理をLookRotationメソッドの中に追加します。ClampRotationAroundYAxis(m_CharacterTargetRot);こうすることでキャラクターの横回転にも制限を加える事が出来るようになります。20:21返事が遅くなり申し訳ありません。クォータニオン等回転の仕組みは以前調べてみたことがありますが「なるほど、わからん。」でお手上げ状態でした。いずれはしっかり理解したい所存です。解決策を教えていただきありがとうございます。Controllerをくっつけて移動させることはできるんですか?2と3の方法でスクリプト書いたりMainCameraの位置を目線に合わせたり、アニメーションを追加しましたがキャラクター自体はIdleのまま一向に動いてくれません。22:01FPSControllerのプレハブ自体ではコライダとキャラクターの移動処理を書いたスクリプトが設定されていますが、アニメーターコントローラーを操作する処理が書かれていません。Characterの階層下にキャラクターモデルを配置しモデルの位置をカメラ位置と合わせます。Ethanをキャラクターモデルとして配置する時は↑のような階層になります。この状態でキーボードの十字キーやマウスを使って視点変更を行うと↑のような感じでカメラの動きに合わせてキャラクターの向きが変わります。FPSなので自身のキャラクターがこのように回転しても問題ありません(自分では銃を撃つときの手だけが見えていれば良い為)が、オフラインで対戦出来るようにしたり、オンライン対応した時にこのようにキャラクターが動いているのが見えると問題なのでそれはそれで対処する必要があります。Controllerというスクリプトの処理の中にキャラクターに取り付けたアニメーターコントローラーを操作する処理を自分でスクリプトを書いていき、アニメーションを変化させる必要があります。わたくしの場合このスクリプトを改造するのが大変そう(わたくしの場合は人の作ったスクリプトを改造するより一から作る方が向いている為)なので「FPSを作ってみよう2」の記事から自分でスクリプトを実装していってます。Geigさんのオンライン対応のFPS作成の動画が非常に参考になります(現在はどちらのリンクも切れてます)。こちらはカプセル形状に銃を持たせたままの実装です(オンライン対応にPhotonを使用)。https://unity3d.com/jp/learn/tutorials/topics/asset-store/merry-fragmas-multiplayer-fps-part-1こちらは通常の人型モデルを使った実装です(オンライン対応にUNETを使用)。Characterの子要素にモデルを配置せず、視点変更時はキャラクターは回転させない仕様になっています。どちらの動画もシリーズもの?で2時間近くの動画がそれぞれ3つありFPSを作っていきます。ControllerでFPSを作っていく時はこちらの動画が非常に参考になりますよ。09:19ありがとうございます!そういうことだったんですね。一応オンライン向けにしようと思ってるのでこの記事を参考にしてみます!詳しい説明ありがとうございます。19:31こんにちは(^^)/FPSControllerのプログラムがうまく作動しませんというだけでは、どういったところでうまく作動?動作?しないかの詳細がわからない為、返答のしようがありません・・・(^_^;)FPSControllerのプレハブをヒエラルキーに配置出来ない。配置したけどキーボードの移動キーを押しても動かない。マウスで視点変更出来ない。コンソールに何らかのエラーが出て実行出来ない、スクリプトのエラーでコンパイルが出来ていない(どんなエラーが出ているのか)以前は動いていたが、パラメータの変更等をしたら動かなった(変更した部分)プログラムを書き換えてしまって動かなくなった(書き換えたとしたらどう書き換えたのか?)詳細を書いて頂くと返答がしやすいです。19:28どのようなエラーがコンソールに表示されているのかわかれば解決のお手伝いが出来るかもしれません。09:27自分でも何でエラーが出ているのかわからないのでUnityのバージョンを変えてやってみます。23:17FPSControllerの設定はあまり見てなかったので試しにやってみました。Sensitivityを0にすると縦の視点移動がなくなるみたいです。23:01自動追尾というのは主人公が敵キャラに近付いたらカメラ(主人公キャラ)の向きを敵キャラの方に向かせるという事でしょうか?でしたらhttps://gametukurikata.com/program/rotateenemyで攻撃の構えをした時に一番近くの敵の方向を向くという機能を作成しているので、これを応用すればFPSControllerでも使えると思います。詳しい仕様を教えて頂ければわたくしの方で機能の作成をしてみます(出来るかどうかはわかりませんが・・・)。20:12ご希望の動作になっているかわかりませんが作成してみました。本日公開した記事https://gametukurikata.com/program/rotatetowardsを少し改造します。Controlerスクリプトを修正します。RotateView();Updateのすぐ後でRotateViewという関数を呼んでいると思うのですが、これをコメント化します。このRotateViewがマウスで視点を操作している処理になります。FPSControllerには新しくRotateDirectionというスクリプトを作り取りつけます。target;}次にFPSControllerの子要素に空オブジェクトを作成し、それにコライダを取りつけサーチエリアとします。それにSearchTargetスクリプトを作り取りつけます。{rotateDirection.SetTarget(null);}}ターゲットを向いた後に戻す時は必ずVector3の前方向になります。↑のような感じで敵が範囲内にいる時にマウスの右ボタンを押したらそちらを向くようになりました。ボタンを押さずにそちらを向かせるにはマウスの右ボタンを押した条件を外します。複数の敵の対応や向きを標準に戻す時に必ず同じ方向を向いてしまうというのは対処が必要かもしれません。16:30すいません、この「FPSを作ってみよう」のTPSバージョンをやってほしいです。19:31FPSカテゴリで作成しているFPSゲームはカメラの位置とカメラの移動がTPSと違うだけなのでそこを変更して頂くとTPSも作れると思います。わたくしのブログでは元々SIRENやバイオハザードみたいなTPSを作りたいというのから始まっているので、ブログの最初の方でバイオハザード風のTPSの機能を作成しています。https://gametukurikata.com/program/baiogunshooterhttps://gametukurikata.com/program/pinpointshooterhttps://gametukurikata.com/program/comenearcamera↑のあたりをご覧頂くとTPSの基本的な部分は記述してあるので参考にして頂けると思います。TPSというカテゴリ分けはしてないですが、あちこちに散らばっているという感じですかね・・・。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。サイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事への質問はコメント欄にお願いいたします)。kamekumechan@gmail.comいずれはSIRENやバイオハザードみたいなアクションゲームを作りたいと思っています。ゲームシナリオが書けないので面白いゲームはなかなか作れません・・・・。(^_^;)名前の由来はカメが好きだからです。Д`)シクシク...お知らせ2020/01/18個人的にUnity2019.2.18f1をインストールしました。2020/01/01あけましておめでとうございます。(^^)/ユニティちゃんのRPGを作ってみようのPartyStatusスクリプトでpartyMembersのListの型がCharacterStatusとなっていたのでAllyStatusに変更しました。変更したというか、元々AllyStatusに書き換える前のスクリプトを掲載していたので修正しました。ユニティちゃんのRPGを作ってみよう10ーコマンド画面の作成とステータスの表示ーユニティちゃんのRPGでコマンド画面の作成とステータスコマンドを作成し、選択したキャラクターのステータスを表示するようにしていきます。20:00GetPartyStatusメソッドの戻り値もそれに伴って変更しています。2018/08/07コメント欄へのわたくしの返信は停止しております。わたくしに出来る事は既に記事にしてあるので、ブログ右上の検索窓を活用してください。(._.)またブログの最初の方の機能を積み上げていく記事に関しての疑問点は当ブログ記事のスクリプトの説明と寄せられた質問への回答Unityを使った3Dゲームの作り方(かめくめ)の機能積み上げ形式の記事のスクリプトの説明と寄せられた記事の機能についての質問への回答を掲載しています。21:41も参照してみてください。コメントの返信はありませんが、回答は記事に反映されている可能性があります。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。Unityを使った3Dゲームの作り方(かめくめ).。