今回はUnityで3Dカメラの視点を左右に切り替える方法をまとめます。
Unityの3Dシーンでは、カメラを切り替える方法はたくさん存在しますが、今回は以下の様な3Dカメラ視点の切り替えを実装してみます。
- 画面上の「右・左」のボタンを押す事で、カメラ視点も右を向く、左を向く
- 視点切り替えは行うが、使用するカメラは一つだけ(一つのカメラの位置、回転を切り替える)
- スムーズにカメラが切り替わる訳ではなくて、ボタンを押したらカメラ視点が一気に切り替わる
一般的な3Dゲームの場合は、カメラ視点はプレイヤーの動作に合せてスムーズに切り替わっていくのが一般的かもしれませんが、アドベンチャーゲームや脱出ゲーム等では、視点が一気に切り替わるとう実装方法が多く使われています。様々な状況で活用できる実装例だと思いますので、ぜひ参考にしてみて下さい。
では、さっそく実装してみます。
3Dカメラの視点を切り替えるための準備
まずはUnityの3Dカメラ視点を切り替えるための準備をしていきます。
カメラに映るオブジェクトの配置
まずは、カメラを切り替えた際に表示されるテスト用オブジェクトを配置します。
今回はSceneビュー上にオブジェクト以下の様な3Dオブジェクトを配置しました。
※カメラ切り替えが分かりやすくなる様に平面の上四隅に3Dオブジェクトを配置しています。
■Sceneビュー上のオブジェクト(正面視点)
■Sceneビュー上のオブジェクト(上から見た視点)
詳細はこの後で紹介しますが、カメラの切り替えをする事で、カメラの中に表示されるオブジェクトが順次切り替わる事が分かると思います。
必要なオブジェクトの作成
次に空のオブジェクトを作成します。
カメラの切り替えコントロール用オブジェクト
まずは、カメラの切り替えをするためのオブジェクトを作成します。
切り替えはC#でスクリプトを作成してアタッチするので、ここで作成するのは「CameraManager」という「空のオブジェクト」です。
■CameraManager(空のオブジェクト)を作成
カメラのTransform情報(位置・回転)を保持するオブジェクト
次にカメラのTransform情報(位置・回転)を保持するためのオブジェクトを作成します。
それ何のために作るの?と思うかもしれませんが、理由は読み進めていただければ分かると思います。
ここではとりあえず、以下の様にオブジェクトを作成してください。
- 空のオブジェクト(Cameras)
- Cubeオブジェクト(CameraPoint1~4)※Camerasの子オブジェクト
■CamerasとCameraPoint1~4
上記のCameraPoint1~4それぞれにカメラの視点となる位置と回転情報を設定する事になります。(大事なポイント)
Cubeのオブジェクトを使用していますが、Cube以外でも良いですし、空のオブジェクトでも全然OKです。
※形が見えるものの方がSceneビュー上でオブジェクトの位置を編集し易いので、Cubeを使用しています。
切り替える3Dカメラの視点(Transform情報)の設定
3Dカメラの視点をどの様に切り替えるかを指定していきます。
今回は「CameraPoint1~4」というオブジェクトを作成しましたが、これらのオブジェクトのTransform情報(位置、回転)がそのままカメラの視点になります。
まずはCameraPoint1のTransform情報(位置、回転)を指定します。
Transform情報を指定する際は、一時的に子オブジェクトとしてCameraを作成して、Gameビューでカメラ視点を確認すると分かりやすいです。
■一時的に子オブジェクトとしてCameraを作成
重要な事は子オブジェクトとして作成したCameraのTransform情報(位置、回転)は変更をしない事です。
親オブジェクトであるCameraPoint1~4のTransform情報(位置、回転)を変更して、希望するカメラ視点を設定します。
■カメラのTransformは変更しない
CameraPoint1のTransform情報(位置、回転)を変更して、カメラの視点を一つ設定しました。
■カメラの視点その1
同じ要領でCameraPoint2~4のTransform情報(位置、回転)を変更して、上から見た時に以下の様な視点となる様にします。
■CameraPoint1~4の上から見た時の視点の違い
- CameraPoint1:北を向く(左に黄色のオブジェクト、右に緑のオブジェクトが見える)
- CameraPoint2:東を向く(左に緑のオブジェクト、右に青のオブジェクトが見える)
- CameraPoint3:南を向く(左に青のオブジェクト、右に赤のオブジェクトが見える)
- CameraPoint4:西を向く(左に赤のオブジェクト、右に黄色のオブジェクトが見える)
各オブジェクトがよく見える様に配置をしたので、Cubeオブジェクト(CameraPoint1~4)の位置も以下の様にずれていますがそれでOKです。
■Cubeオブジェクト(CameraPoint1~4)の位置
CubeオブジェクトのTransform情報を確認
一応、CameraPoint1~4のTransform情報(位置、回転)を確認しておきます。それぞれ以下の様になっています。
回転(Rotation)の情報が90度ずつずれている事を確認してみて下さい。また、視点位置を調整するため、位置(Position)の値も変更しています。※単純に同じ位置で90度ずつ回転すると、カメラ視点が綺麗に切り替わらないので変更しています。
■CameraPoint1のTransform情報(位置、回転)
■CameraPoint2のTransform情報(位置、回転)
■CameraPoint3のTransform情報(位置、回転)
■CameraPoint4のTransform情報(位置、回転)
Cubeオブジェクトは見えない様にする
Cubeオブジェクトで作成したCameraPoint1~4は、あくまでTransform情報(位置、回転)を設定するためのものです。
※本来は空のオブジェクトで作成しても良いのですが、位置を分かりやすくするためにCubeオブジェクトを使用しました。
ただ、Cubeオブジェクトは実際にGameビュー上では、カメラには表示されない様にしたい所です。
なので、CubeオブジェクトのMeshRendererとBoxColliderはOFFにしておきます。
※非アクティブにしてしまうと、Transform情報(位置、回転)も保持できません。
■MeshRendererとBoxColliderはOFF
CameraPoint1~4(Cubeオブジェクト)のMeshRendererとBoxColliderはOFFにしたので、以下の様に画面には表示されない状態になりました。
■CameraPoint1~4は表示されない状態
Unityで3Dカメラの視点を左右に切り替える仕組み
続いて3Dカメラの視点を切り替える仕組みを作ります。
CameraManagerスクリプトの作成
最初にCameraManagerという空のオブジェクトを作成しましたが、このオブジェクトに以下のスクリプトをアタッチします。
簡単なスクリプトなので、細かい説明は割愛しますが、スクリプトのコメントを見ていただくと、大体の処理内容が分かると思います。
■C#スクリプト(CameraManager)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraManager : MonoBehaviour { // cameraのTransform情報(配列) [SerializeField] Transform[] cameraTransform = default; // 現在のカメラのTransform情報(index)- 初期値:0 int cameraIndex = 0; void Start() { SetCameraTransform(cameraIndex); } void Update () {} //関数:カメラ視点を右に回転(indexを加算) public void TurnToRight() { cameraIndex++; if(cameraIndex >= cameraTransform.Length) { cameraIndex = 0; } SetCameraTransform(cameraIndex); } //関数:カメラ視点を左に回転(indexを減算) public void TurnToLeft() { cameraIndex--; if (cameraIndex < 0) { cameraIndex = cameraTransform.Length -1; } SetCameraTransform(cameraIndex); } //関数:カメラのTransform情報(位置、回転)変更 void SetCameraTransform(int index) { //引数のindexを元にカメラのTransform情報(位置、回転)を変更 Camera.main.transform.position = cameraTransform[index].position; Camera.main.transform.rotation = cameraTransform[index].rotation; } } |
CameraManagerのコンポーネント
CameraManagerのコンポーネントを確認してみると、[SerializeField]を指定したcameraTransformの値を設定する事ができます。
今回は4方向で視点切り替えをしたいので、配列の個数を4に設定します。
そうするとinputとしてElement0~4が指定できますので、ここにCameraPoint1~4のオブジェクトを設定します。
■cameraManagerのinputにCameraPoint1~4のオブジェクトを設定
左右のボタンの作成
次にカメラ視点を左右に切り替えるためのボタンを画面上に配置します。
CanvasのButtonで左(≪)、右(≫)のボタンを配置します。※赤い矢印の箇所
■左(≪)、右(≫)のボタンを配置
Buttonに先ほど作成したスクリプトの関数をアタッチします。
※「On Click()」でボタンを押した場合の関数をアタッチできます。
以下の様にボタン押下時の関数を設定しましょう。
- 左(≪)のボタンを押した場合は「TurnToLeft」
- 右(≫)のボタンを押した場合は「TurnToRight」
以下は右(≫)のボタンに「TurnToRight」を設定した場合の例です。
■右(≫)のボタンに「TurnToRight」を設定
Unityの3Dカメラの視点切り替えの動作確認
これで実装が完了しました。
実際に実行時のGameビューで3Dカメラの視点切り替えの動作確認をしてみます。
右(≫)のボタン
右(≫)のボタンを押すと、画面が右に切り替わっていくのが分かります。
■画面が右に切り替わる
左(≪)のボタン
左(≪)のボタンを押すと、画面が右に切り替わっていくのが分かります。
■画面が左に切り替わる
まとめ
今回はUnityで3Dカメラの視点を左右に切り替える方法について紹介しました。
■今回のまとめ
- 3Dカメラの切り替えコントロール用のオブジェクト作成
- 切り替える3Dカメラの視点(Transform情報)となるオブジェクトの設定※今回はCubeオブジェクトで作成
- 3Dカメラの視点となるCubeオブジェクトは画面上見えない様にする
- 3Dカメラの視点を切り替えるためのCameraManagerスクリプトの作成
- 左右のボタンの作成
- 左右のボタンで視点が切り替わる事を確認
3Dのゲーム(特にアドベンチャーや、脱出ゲーム)ではよく活用するテクニックなので、実装方法や考え方をしっかりと覚えておきましょう。