今回はUnityで複数の3Dカメラを切り替える方法について解説をしたいと思います。
以前はUnity上の1つのカメラを使用してカメラの視点(位置、回転等のTransform情報)のみ切り替える方法を実践しました。
今回はUnityで3Dカメラの視点を左右に切り替える方法をまとめます。 Unityの3Dシーンでは、カメラを切り替える方法はたくさん存在しますが、今回は以下の様な3Dカメラ視点の切り替えを実装してみます。 画面上の「右・ …
今回は同じカメラを使用するのではなくて、Sceneビュー中に複数のカメラを設置して、カメラそのものを切り替える方法を実践してみたいと思います。
Unityで3Dのゲームやアプリを開発する際は、よく活用する方法なので、ぜひ使いこなせる様にしておいて下さい。
コンテンツ
Unityの3Dカメラ切り替えのための準備
切替えで使用するカメラを3つ(MainCamera、Camera1、Camera2)用意して、Sceneビューの中に配置します。
■Hierarchyウィンドウ
■カメラを3つ用意
この記事ではそれぞれ以下の様に呼ぶ事にします。
- MainCamera:メインカメラ
- Camera1:サブカメラ1
- Camera2:サブカメラ2
使用するカメラはメインカメラと手動で追加したサブカメラが2つになります。
それぞれのカメラ視点の画像は以下になります。
■メインカメラ
■サブカメラ1
■サブカメラ2
注意点:カメラには描画優先度がある
カメラを複数使う際には一つ注意点があります。
各カメラには描画優先度があります。画面表示できるカメラは一つなので、最優先のカメラが有効になると考えればOKです。
描画優先度はカメラのコンポーネントの「Depth」で指定できます。
各カメラ作成時点で「Depth」の値は以下の様になっています。
- MainCamera:-1
- Camera1:0
- Camera2:1
「Depth」の値が大きいCamera2が描画優先度が高いと考えればOKです。
■各カメラの「Depth」の値
Unityの3Dカメラの切り替えの考え方
カメラ切り替えの方法は非常にシンプルで、使用したいカメラのオブジェクトをアクティブにして、それ以外のカメラを非アクティブにするというものです。
この後でも紹介しますが、同時に2つ以上のカメラをアクティブにするにするとエラーになる事があるので、処理の順番としては、全てのカメラを非アクティブにしてから、対象カメラをアクティブにする様にしています。
それぞれのカメラをアクティブにする際の処理について紹介しておきます。
メインカメラをアクティブにする
以下の処理を行う関数を作成します。
- メインカメラをアクティブにする
- 他は非アクティブにする
■C#スクリプト
1 2 3 4 5 6 |
public void ActiveMainCamera() { subCamera1.gameObject.SetActive(false); subCamera2.gameObject.SetActive(false); mainCamera.gameObject.SetActive(true); } |
サブカメラ1をアクティブにする
以下の処理を行います。
- サブカメラ1をアクティブ
- 他は非アクティブ
■C#スクリプト
1 2 3 4 5 6 |
public void ActiveSubCamera1() { mainCamera.gameObject.SetActive(false); subCamera2.gameObject.SetActive(false); subCamera1.gameObject.SetActive(true); } |
サブカメラ2をアクティブにする
以下の処理を行います。
- サブカメラ2をアクティブ
- 他は非アクティブ
■C#スクリプト
1 2 3 4 5 6 |
public void ActiveSubCamera2() { mainCamera.gameObject.SetActive(false); subCamera1.gameObject.SetActive(false); subCamera2.gameObject.SetActive(true); } |
Unityの3Dカメラ切り替えの実装
実際に3Dカメラを切り替える処理を実装しましょう。
UIとして3Dカメラ切り替えのボタンを用意して、ボタンを押したらカメラが切り替わる様にします。
3Dカメラ切り替えのC#スクリプト
3Dカメラ切り替えを行うC#スクリプトを紹介します。
■C#スクリプト
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 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraManager2 : MonoBehaviour { public Camera mainCamera = default; //メインカメラ public Camera subCamera1 = default; //サブカメラ1 public Camera subCamera2 = default; //サブカメラ2 void Start() { //メインカメラを設定 mainCamera = Camera.main; //メインカメラを有効化する ActiveMainCamera(); } void Update(){} //関数:メインカメラを有効化 public void ActiveMainCamera() { subCamera1.gameObject.SetActive(false); subCamera2.gameObject.SetActive(false); mainCamera.gameObject.SetActive(true); } //関数:サブカメラ1を有効化 public void ActiveSubCamera1() { mainCamera.gameObject.SetActive(false); subCamera2.gameObject.SetActive(false); subCamera1.gameObject.SetActive(true); } //関数:サブカメラ2を有効化 public void ActiveSubCamera2() { mainCamera.gameObject.SetActive(false); subCamera1.gameObject.SetActive(false); subCamera2.gameObject.SetActive(true); } } |
C#スクリプトの説明
簡単ですがスクリプトの説明もしておきます。
- Public変数としてカメラを定義(Unityエディタでカメラを設定できる様にしている)
※各カメラを変数として定義する事で非アクティブ時もオブジェクトを取得できる - 最初はメインカメラをアクティブにする
- メインカメラ、サブカメラ1、サブカメラ2それぞれを有効にする関数を作成
3Dカメラ切り替えボタンを作成
スクリプトも出来上がったので、3Dカメラの切り替えボタン(UI)を作成します。
■切り替えボタン(UI)を作成
それぞれのボタンの処理内容は以下の通りになります。
- 「Main」ボタン:メインカメラを有効にする
- 「Sub1」ボタン:サブカメラ1を有効にする
- 「Sub2」ボタン:サブカメラ2を有効にする
※ボタン押下時の設定については以下の記事(ボタン押下時の処理)を参考にして下さい。
参考記事:Unityでタイトル画面を作る!ボタンクリックで画面遷移!
3Dカメラ切り替えの動作確認
切り替えの動作確認をしてみます。
■動作確認
切り替えボタンを押す事でカメラが切り替わっています。
AudioListenerのエラーが出る場合
カメラ切り替えをした際に以下のエラーが出る事があります。
エラー:camera audio listener
これは各Cameraオブジェクトが持っているAudio Listenerコンポーネントが複数有効になっている場合に発生します。
Audio Listenerを有効にできるのは1つだけと覚えておきましょう。カメラを切り替える際はAudio ListenerをOFFにするか、一旦全てのカメラを非アクティブにしてから、対象カメラをアクティブにする必要があります。
まとめ
今回はSceneビュー中に複数のカメラを設置して、カメラを切り替える方法について解説をしました。
考え方を非常にシンプルで、有効にしたいカメラのオブジェクトをアクティブに設定して、それ以外のカメラを非アクティブにするという考え方でOKです。
注意点として、複数のカメラを扱う場合は、描画優先度やAudio Listenerコンポーネントを考慮しなければなりません。
カメラの操作は一見複雑そうにも見えますが、考え方が分かればすごく簡単です。
ぜひ複数カメラの切り替え処理も使いこなしてみて下さい。