Unityに関連する記事です

 FPS ゲームのプレイヤーキャラクターの移動とカメラの回転機能の実装例です。

 プレイヤーの移動は十字キーによるもので、移動軸は前後左右になり、視点(向き)は変わりません。
マウスを動かすことで、カメラが回転し、視点が変わります。また、カメラと同じ方向を銃が向きます。

 キー入力値に対してプレイヤーはカメラの正面方向を基準に前進・後退します。


<確認動画 ーカメラの回転ー>
動画ファイルへのリンク


<確認動画 ープレイヤーの移動ー>
動画ファイルへのリンク



プレイヤーの移動

1.Player 用ゲームオブジェクトの構成


 あくまでもサンプルの構成ですので、自分のプロジェクトの内容に合わせて変更して利用してください。


ゲームオブジェクトの構成




 ヒエラルキーで Create Empty を行い、Player 用のゲームオブジェクトを作成します。
その子オブジェクトとして、Body ゲームオブジェクトを作成し、さらに Body ゲームオブジェクトの子オブジェクトとして銃のゲームオブジェクトを配置します。

 Player ゲームオブジェクトにはコライダーと Rigidbody コンポーネントをアタッチします。
コライダーのサイズはゲームの環境に合わせて、プレイヤーの当たり判定として利用することを前提に設定してください。

 Body ゲームオブジェクトも Create Empty で作成しておきます。
このゲームオブジェクトはカメラの追従対象になる部分です。また、銃口の向きに合わせて回転するゲームオブジェクトです。

 銃のゲームオブジェクトについては、アセットストアなどからインポートしたものを利用してください。


Player ゲームオブジェクト



Sceneビュー




Body ゲームオブジェクト



Sceneビュー




銃のゲームオブジェクト



Sceneビュー




 ゲームオブジェクトを作成するときに、親子関係がある場合、それぞれの位置が大切になります。
子オブジェクトを作成したら、まずは (0,0,0) の位置に合わせてから、調整を行うようにしましょう。


2.PlayerController(PlayerMove)スクリプトを作成する


 サンプルスクリプトですので、自分のプロジェクトに合わせて適宜調整してください。

 このスクリプトはプレイヤーの移動制御を行うためのものです。Player ゲームオブジェクトにアタッチして利用します。

 スクリプトを用意する場合、どのゲームオブジェクトで利用するかを把握してから作成することが大切です。



PlayerController.cs

 <= クリックすると開きます


 スクリプトを作成したらセーブします。


3.<三項演算子>


 三項演算子という処理は、if / else 文の分岐処理を1行で簡潔に記述できる書式です。
ただし、すべての if / else 文を置き換えられるわけでなく、

 (岐処理内部で同じ変数に対して代入処理を行っている分岐処理
 ∧岐処理内部でreturn 文で同じ型の情報を戻す分岐処理

 このいずれかのみ、置き換えることが出来ます。

 今回であれば、ProcessInput メソッド内の分岐処理が,乏催します。
こちらを三項演算子を利用することで処理を簡潔に記述することが出来ます。


    // Shiftキーを押している場合は速度を増加させる
      if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
      {
          speed = runSpeed;
      }
      else
      {
          speed = walkSpeed;
      }

 この条件式を三項演算子にして if / else 文を1行にまとめると、次のような式になります。

    ↓

<三項演算子を使って書き換えた場合>
  // Shiftキーを押している場合は速度を増加させる
    speed = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift) ? runSpeed : walkSpeed;



 三項演算子はその名前の通りで、3つの項目があります。

【条件文】 ? 【trueだった場合返す値や処理】 : 【falseだった場合返す値や処理】

 右辺では、この条件式とtrueとfalseの3つの項目を用意して、その結果に合わせて左辺へ値を代入します。


参考記事
Qiita @crazy_traveler 様
参考になる三項演算子


4.Player ゲームオブジェクトに PlayerController スクリプトをアタッチする


 Player ゲームオブジェクトに PlayerController スクリプトをアタッチします。

 アタッチしたら必ずインスペクターを確認しましょう。
PlayerController には移動速度などを設定する必要がありますので、適宜な値を設定してください。


Player ゲームオブジェクト インスペクター画像



5.ゲームを実行して動作の確認をする


 それではここまでの手順を確認するため、ゲームを実行して、動作を検証します。

 プレイヤーの移動が正常に動作すれば問題ありません。
移動しない場合には、PlayerController スクリプトのアタッチの確認、移動速度用の値の確認などを行いましょう。

 どのような機能になっているのか、作っている自分がしっかりと把握しておく必要があります。


<確認動画>
動画ファイルへのリンク


 この時点ではカメラの追従処理がありません
そのため、ゲーム画面は固定されたままで、プレイヤーのみが移動を行います

 Scene ビューで移動が行われていることを確認しましょう。


カメラの設定


 プレイヤーの移動が完成したので、次は、カメラの作成と設定を行います。


1.<Virtual Camera の作成>


 Cinemachine を利用して FPS 用のカメラの作成を行います。

 ヒエラルキーにてメニューを開き、Cinemachine → Virtual Camera を選択してカメラを追加します。
CM vcam1 ゲームオブジェクトが作成されます。




 名称はそのままでもよいですし、FPSCamera のように変更しても構いません。



 Cinemachine のカメラがヒエラルキーに追加されましたので、MainCamera ゲームオブジェクトに Cinemachine Brain コンポーネントが自動的に追加されます。





2.<Virtual Camera の設定>


 Cinemachine カメラである CM vcam1 ゲームオブジェクトの設定を行います。

 Follow に Body ゲームオブジェクトをアサインします。
これでカメラがプレイヤーを追従するようになります。






 Body の設定については、Framing Transposer を設定します。
下記の画像を参考にしてください。

 カメラとプレイヤーとの位置関係については Camera Distance で設定できます。
上下などを合わせる場合には Tracked Object Offset の値で設定できます。

 また、移動に合わせてカメラが迅速に対応するように各 Damping の設定を 0 にしています。






 続いて、Aim の設定を POV にします。POV とは Point Of View の略で、FPS 視点として利用できるカメラの設定です。

 この設定にすると、マウスの上下左右に合わせてカメラが移動するようになります。
入力方向の反映(Invert)や感度についても設定できます。





Game ビュー



3.GunController スクリプトを作成する


 アタッチされているゲームオブジェクトの回転をカメラの回転と合わせるためのスクリプトです。
このスクリプトは Body ゲームオブジェクトにアタッチする前提で作成します。



GunController .cs

 <= クリックすると開きます


 スクリプトを作成したらセーブします。


4.<LateUpdate() メソッド>


 カメラの回転と銃の回転の向きとが同期させるため、Update メソッドではなく、LateUpdate メソッドを使って位置を合わせています。

 Update に切り替えて試すとわかりますが描画のタイミングの関係で、回転に対して、画面の描画がずれます。
これは、カメラの映す情報が、Unity の内部処理的に、毎フレームの「一番最後」に更新が入るためです。
 
 そのため GunController で利用している処理は LateUpdate メソッドで、プレイヤーの位置とカメラの位置を同期しています。
この処理にすることでズレがなくなります。

Unity 公式マニュアル
イベント関数の実行順序

 最初は読み解くのが難しいですが、基本的には Unity のマニュアルは目を通しておいた方がいいでしょう。


5.Body ゲームオブジェクトに GunController スクリプトをアタッチする


 Body ゲームオブジェクトに GunController スクリプトをアタッチし、カメラの回転と銃口の向きを同期するようにします。

 アタッチしたら必ずインスペクターを確認しましょう。


Body ゲームオブジェクト インスペクター画像



6.ゲームを実行して動作の確認をする


 完成しましたので、ゲームを実行して確認を行います。

 確認すべき内容は理解できていますか?
漠然と動かすのでは学習になりません。スクリプトの内容を読み解き、Unity のインスペクターも活用して動作を検証しましょう。

 動くかどうかではなくて、正しく動作をしているか、検証作業であることを理解しておいてください。

 カメラの回転と銃の回転の向きとが同期するようになっていれば問題ありません。


<確認動画 ーカメラの回転ー>
動画ファイルへのリンク


<確認動画 ープレイヤーの移動ー>
動画ファイルへのリンク


 以上で完成です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます