Unityに関連する記事です

カメラの追従処理


 TPS ゲームにおけるカメラの追従処理と回転処理についての実装例です。


<実装動画>
動画ファイルへのリンク


 カメラの回転機能について、今回はスクリプトを作成していますが、Unity に用意されている Cinemachine(シネマシン) の機能を活用する方法もあります。
そちらは、Unity 公式の実装動画がありますので、参考にされてみてください。
UnityJapan 様
自由に走り回れる三人称視点のキャラクターを作る方法 - Cinemachine TIPS #1
https://www.youtube.com/watch?v=VqS1dTiVLFA



設計


 プレイヤー用のゲームオブジェクトを作成し、このゲームオブジェクト用にスクリプトを作成します。
このスクリプトではプレイヤー用のゲームオブジェクトの制御を行えるようにして、移動機能を実装します。

 その後、カメラ用のスクリプトを作成します。こちらのスクリプトでは、カメラがプレイヤー用のゲームオブジェクトを追従する機能と
マウスの右ボタンを押し続けている間はカメラがプレイヤー用のゲームオブジェクトの周囲を公転回転する機能を実装します。
 

PlayerController スクリプトを作成する


 こちらのスクリプトは、下記の記事を参考にさせていただいております。
ありがとうございます。
TechProjin 様
Unityでカメラの向きを基準に移動する方法と、追従して回転できるカメラの実装
https://tech.pjin.jp/blog/2016/11/04/unity_skill_5...


PlayerController.cs

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



<Vector3.Scale() メソッド>


 Unity の Vector3 の扱える情報の1つです。

 第1引数の各成分と、第2引数の同じ成分を乗算した結果を、戻り値として Vector3 型で取得します。
そのため、計算結果を代入する Vector3 型の変数を用意しておく必要があります。

  // カメラの方向から、X-Z平面の単位ベクトルを取得
  Vector3 cameraForward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized;

 Camera.main.transform.forward には、(0, 0, 1) の値が代入されています。
上記の場合、(0 * 1, 0 * 1, 1 * 1) という計算が行われることになります。

 Y 軸のみ常に 0 の値が乗算されるため、処理の結果として、cameraForward の値は、X と Z の情報はそのまま、Y は 0 という結果が戻り値として得られて、
cameraForward の値に代入されます。そのため、Camera.main.transform.forward の値から Y 成分のみ除去し、0 にすることが出来ています。


参考サイト
Unity 公式スクリプトリファレンス
Vector3.Scale



<Quaternion.LookRotation() メソッド>


 Quaternion 構造体に用意されている、ゲームオブジェクトを回転させる static メソッドです。
LookRotation メソッドを利用することで、引数に指定した Vector3 型の情報を Quaternion 型に変換します。(戻り値の型が Quaternion 型になっています)


  transform.rotation = Quaternion.LookRotation(moveForward);

 transform.rotation 変数は Vector3 型ではなく、Quaternion 型です。
そのため、Vector3 型の値をそのまま transform.rotation 変数に代入することが出来ません。

 上記のように、Quaternion.LookRotation メソッドを活用することで、Vector3 型の情報を Quaternion 型に変換し、代入処理を成立させています。

 なお、Vector3 型の情報をそのまま回転情報として代入するには、Quaternion.LookRotation メソッドではなく、Transform.eulerAngles 変数を利用します。


参考サイト
Unity 公式スクリプトリファレンス
Quaternion.LookRotation


hildsoftのコード置き場 様
Unityで対象となるオブジェクトを向くように回転させたい(Quaternion.LookRotation)



Unity 公式スクリプトリファレンス
Transform-eulerAngles



プレイヤーのゲームオブジェクトに PlayerController スクリプトを作成する


 スクリプトを作成したら、プレイヤー用のゲームオブジェクトにアタッチしてください。
PlayerController スクリプトには RequireComponent(typeof(Rigidbody)) 属性が付与されているため、自動的に Rigidbody コンポーネントもアタッチされます。

 最初に PlayerController スクリプトの MoveSpeed 変数の設定を行います。初期値は 3 前後に設定しておくといいでしょう。

 次に Rigidbody コンポーネントの Constraints の設定内にある FreezeRotation の各設定(X、Y、Z)をオンにします。FreezePosition と間違えないようにしてください。
この設定が有効になっていないと、移動と同時に回転してしまうためです。


プレイヤーのゲームオブジェクトの移動を確認する


 プレイヤー用のゲームオブジェクトに PlayerController スクリプトをアタッチしましたので
ゲームを実行して、プレイヤー用のゲームオブジェクトがゲーム内で移動を行えるようになっているかを確認します。

 この時点では、まだカメラがプレイヤー用のゲームオブジェクトを追従しませんので、
移動していると、ゲーム画面からプレイヤー用のゲームオブジェクトがはみ出して見えなくなります。

 ゲームの製作では、1つの機能を実装したがデバッグを行い、問題点がないかを確認します。
その上で、先の手順に進むことにより、少しずつ機能の実装を行いながら、目標とする処理の構築を行います。

 最初からすべてを一気に作成することは難しいため、1つの機能が完成したら、必ずでデバッグを行う癖をつけましょう。

 問題なくプレイヤー用のゲームオブジェクトが移動を行えることを確認できたら、次のカメラ機能の実装に移ります。


CameraController スクリプトを作成する(通常のカメラの場合)


 Cinemachine を利用しない場合、作成したスクリプトを MainCamera ゲームオブジェクトにアタッチして利用する設計での実装例です。

 こちらのスクリプトも、下記の記事を参考にさせていただいております。
ありがとうございます。
TechProjin 様
Unityでカメラの向きを基準に移動する方法と、追従して回転できるカメラの実装
https://tech.pjin.jp/blog/2016/11/04/unity_skill_5...


 マウスの右ボタンを押し続ける(ドラッグしている)間、カメラの上下左右の公転回転が可能になります。
また、記事の内容に加えて、カメラの上下の可動域(X 軸に制限)を設けています。左右は 360 度回転可能です。


CameraController.cs

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




 スクリプトを作成したら、MainCamera ゲームオブジェクトにアタッチします。

 インスペクターから CameraController の設定を行います。
targetObj 変数には、カメラに追従させたいゲームオブジェクトを、ヒエラルキーからドラッグアンドドロップしてアサインします。

cameraRotateSpeed 変数と MaxLimit 変数には初期値が設定されますが、デバッグを行いながら任意の値に調整してください。


CameraControllerFromCinemachine スクリプトを作成する(Cinemachine によるカメラの場合)


 Cinemachine を利用する場合のスクリプトです。

 追従の処理については Cinemachine の Follow に追従対象を設定している想定です。
また、X 軸の可動域についても処理が異なります。これらの値については、実行しながら調整してください。

 スクリプトの内容は一部異なりますが、ゲーム内でのプレイヤーが行うカメラの操作方法は同じです。

 マウスの右ボタンを押し続ける(ドラッグしている)間、カメラの上下左右の公転回転が可能になります。
また、記事の内容に加えて、カメラの上下の可動域(X 軸に制限)を設けています。左右は 360 度回転可能です。


CameraControllerFromCinemachine.cs

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


 スクリプトを作成したらセーブします。
Virtual Studio ではショートカット機能があり、Ctrl + Shift + S キーの同時押しで開いているすべてのスクリプトをまとめてセーブができます。

 この CameraControllerFromCinemachine スクリプトは MainCamera ゲームオブジェクトではなく、
CinemachineVirtualCamera コンポーネントがアタッチされているゲームオブジェクトにアタッチしてください。


Cinemachine の設定


 カメラに Cinemachine を利用している場合、CinemachineVirtualCamera コンポーネントの設定を見直します。

 Follow プロパティには、カメラが追従する対象のゲームオブジェクトをアサインしてください。

 LookAt プロパティには何もアサインしないでください。その場合、Aim の部分に警告が表示されますが、手順通りに進めると解消されます。


 続いて、 Body プロパティの設定を Framing Transposer に設定してください。(CinemachineBrain の WorldUpOverride の設定は不要です。)
また、Aim プロパティの設定を Do nothing に設定してください。この設定を行うと LookAt の部分の警告も解消されます。
なお、この2つの設定を行わないと正常にスクリプトが動作しません。(例えば Aim の設定を DoAnything にしていないと、カメラの上下回転が動きません。)


<設定例(CinemachineVirtualCamera の上記の設定のみ参考とし、Transform などの値は参考にしないでください)>





 Cinemachine のカメラの上下左右の位置は、Tracked Traget Offset の値ではなく、ScreenY と ScreenX の値で調整してください。
オフセットに値を設定すると回転時にカメラが想定している挙動を行わなくなります。

 追従対象との距離(Z軸方向)については、Camera Distance の値で調整してください。


<設定例(各項目の値は、任意の値に調整してください)>



 各 Damping の値を 0 にすることで、カメラがすぐにプレイヤーを追従するようになります。


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


 ゲームを実行して、プレイヤーの移動、およびカメラが回転するかを確認してください。
インスペクターにある各数値を調整し、自分の考えているイメージに近い形で実装しましょう。


<実装動画>
動画ファイルへのリンク




 以上で完成です。
おつかれさまでした。

 注意点としましては、通常のカメラ、Cinemachine 問わず、カメラを瞬時に反転させる処理(Rotation.y を 0 → 180 など)については、
移動の処理にカメラの方向を参照している都合上、回転処理が競合してしまい、正常に動作しなくなります。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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