こんにちは、ともくんのゲーム作り部屋にようこそ!
このページでは、
「Unityでカメラを切り替える方法を知りたい!」
「ゲーム内の視点をどうやって切り替えればいいの?」
というお悩みの方に向けた内容となっています。
Unityでは、カメラオブジェクトを使うことで、ゲーム内で表示させたい範囲を決めることができます。
そして、複数のカメラオブジェクトを使うことで、ゲーム内の視点を切り替えることができます。
具体的には、表示させたいカメラをオンにして、他の視点のカメラをオフにすることで、視点を切り替えることができます。
そこで、このページでは、Unityでカメラオブジェクトを切り替えてゲーム内の視点表示を変える方法についてまとめていきます。
複数のカメラを切り替える方法
ここでは、以下のようにオブジェクトを配置しておき、カメラを切り替える処理を作っていきます。

なお、青色のオブジェクトはプレイヤーと見立てています。
視点切り替え用のカメラを作成する
まずは、視点切り替え用にカメラを複数作成していきます。
現時点では、デフォルトの「Main Camera」は、プレイヤーの後ろ側から前方向に撮影する形で配置しています。
このカメラとは別に、
- プレイヤーの前側から後ろ方向へ撮影するカメラ
- プレイヤーの頭上から下方向へ撮影するカメラ
を作って、合計3つのカメラを切り替えていきます。

カメラを新しく設置する際は、ヒエラルキーウィンドウの+ボタンを押して、「Camera」を選択します。

ここでは、それぞれ「Sub Camera 1」と「Sub Camera 2」という名前にしました。

Sub Camera 1は、プレイヤーの前側に設置して、Rotationで回転させておくことで、プレイヤーに対して後ろ方向を表示できるようにしています。

Sub Camera 2は、プレイヤーの上側に設置して、同じくRotationで真下を向くように調整することで、上からの視点を表示させるようにしています。

これで、それぞれ3つのカメラを作ることができました。
なお、ゲーム起動時は、Main Cameraでの視点で始めたいので、Sub Camera 1とSub Camera 2はオフにしておきます。
ボタンを配置してカメラを切り替える処理を作る
カメラの切り替えの処理は、画面内に配置したボタンを押すことで、カメラのオンとオフが切り替わるようにしていきます。
まず、ヒエラルキーウィンドウの+ボタンから「UI」の中にある「Button – TextMeshPro」をクリックします。

ここでは、ボタンを画面の左上に表示させて、中のテキストをMain Camera用に「Main」としています。

同じように、Sub Camera 1用のボタンを「Sub1」、Sub Camera 2用のボタンを「Sub2」として、それぞれのカメラに対応するボタンを作っていきます。

次に、空オブジェクトを一つ作成(ここでは「CameraSwitcher」という名前)して、このオブジェクトに以下のスクリプトをアタッチしていきます。
using UnityEngine;
public class CameraSwitcher : MonoBehaviour
{
public GameObject[] cameraArray; // カメラを取得する用の配列を作成する
bool judgment; // カメラをオンにするかどうかを判定する変数
// ボタンをクリックした場合
public void OnButtonClick(int activeCamera) // 引数で整数を指定する
{
// カメラの配列の数を繰り返す処理
for (int i = 0; i < cameraArray.Length; i++)
{
if (i == activeCamera)
{
judgment = true; // ボタンの引数とカメラの配列の要素番号が一緒ならtrue
}
else if (i != activeCamera)
{
judgment = false; // ボタンの引数とカメラの配列の要素番号が違うならfalse
}
cameraArray[i].SetActive(judgment); // それぞれのカメラのオンオフを行う処理
}
}
}
5行目でそれぞれのカメラを一括で管理できるように、配列をpublic修飾子を付けて作成しています。
後ほどでいいのですが、この配列には中身が無いので、空オブジェクトを選択した状態で、インスペクターウィンドウから配列の要素を3つ追加して、それぞれのカメラの実体を入れてあげます。

この時、上記のように「0」にMain Camera、「1」にSub Camera 1、「2」にSub Camera 2を入れてあげます。
次に、9行目でクリックした処理を行うOnButtonClickメソッドを作成して、引数にactiveCameraという変数を指定し、整数を取得できるようにしておきます。
メソッドの中の14行目から21行目で、配列の要素番号とactiveCameraの整数が一致しているかどうかを判定して、trueかfalseかを「judgment」というbool型の変数で取得しています。
22行目で、それぞれのカメラをオンにするかオフにするかをjudgmentの変数を元に、SetActiveメソッドで処理しています。
あとは、ボタンをクリックした際のイベント処理を作っていきます。
まず「Main」のボタンを選択して、On Click()に「CameraSwitcher」の空オブジェクトを指定して、ドロップダウンから「CameraSwitcher」のスクリプトにある「OnButtonClick(int)」を選択します。
空欄にint型の引数を指定できるので、配列の要素番号と同じ「0」を指定します。

他の「Sub1」と「Sub2」も同様に、クリックイベントを設定して、引数をそれぞれ「1」と「2」に指定します。


これでゲームを実行してみると、

それぞれのボタンを押すと、そのカメラだけがオンになり視点を切り替えることができました。
それぞれのカメラをプレイヤーに追従させる
ここまででカメラの切り替えをすることができましたが、実際はプレイヤーを移動させながらカメラの切り替えをすることになると思います。
そこで、最後にプレイヤーが移動したら、それに合わせてカメラも追従していく仕組みを作っていきます。
ここでは、カメラを追従させるのに最も簡単な方法として、プレイヤーの子オブジェクトにカメラを入れます。

プレイヤーとカメラを親子関係にしておくことで、親のプレイヤーが移動すると子のカメラも一緒に移動するように動いてくれます。
なお、スクリプトからもカメラを追従させることができるので、以下の記事も参考にしてみてください。
そして、実際にプレイヤーも移動できるように、以下のスクリプトをアタッチしておきます。
using UnityEngine;
public class PlayerController : MonoBehaviour
{
float speed = 0.03f;
void Update()
{
if (Input.GetKey(KeyCode.W))
{
transform.Translate(0, 0, speed);
}
if (Input.GetKey(KeyCode.S))
{
transform.Translate(0, 0, -speed);
}
if (Input.GetKey(KeyCode.D))
{
transform.Translate(speed, 0, 0);
}
if (Input.GetKey(KeyCode.A))
{
transform.Translate(-speed, 0, 0);
}
}
}
キーボードのWASDキーで、それぞれの方向に「transform.Translate」を使って移動するように処理をしています。
これでゲームを実行してプレイヤーを動かしてみると、

プレイヤーを動かしながらカメラを切り替えて、視点表示を変更することができています。
まとめ
このページでは、Unityで複数のカメラを切り替える方法についてまとめていきましたが、いかがでしたでしょうか?
ゲーム内での視点表示を切り替えるためには、複数のカメラを設置して、それぞれをオン・オフしていくことで、切り替えることができます。
複数のカメラを一括管理できるように、配列やリストを作ってそれぞれのカメラを制御できるようにしておきましょう。
そして、カメラを追従させるようにしておくことで、プレイヤーの移動に合わせながら視点移動も行うことができるようになり、より充実したゲームになっていきます。
最後までお読みいただきまして、ありがとうございました!
コメント