こんにちは、ともくんのゲーム作り部屋にようこそ!
このページでは、
「Unityのカメラってどんな役割があるの?」
「カメラを使ってどんなことができるの?」
というお悩みの方に向けた内容となっています。
Unityでゲーム画面を表示させる際に重要になってくるのが、カメラオブジェクトです。
このカメラオブジェクトは、ゲームを実行した際に実際に表示させる範囲を決めています。
簡単にいえば、ゲーム内のカメラマンの役割をしていて、そのカメラで撮影している部分だけが実際にゲーム画面として表示されることになります。
そこでこのページでは、Unityのカメラオブジェクトについて、どんな役割を持っているのか、またできることをまとめていきます。
Unityのカメラオブジェクトの役割
Unityでは、新しくオブジェクトを作成したり、シーンを作成した際に、ヒエラルキーウィンドウにカメラオブジェクトが初めから作成されています。

ここでは、このカメラオブジェクトの役割について、紹介していきます。
ゲーム内を撮影して表示させる部分を決めている
カメラオブジェクトは、冒頭でも解説した通り、ゲームを実際に表示させる範囲を決めているオブジェクトです。
例えば、ドラマなど私たちが普段テレビで見ている映像は、当然ですがカメラマンがカメラで撮影した部分だけが流れています。
これと同じで、ゲーム内で様々な動きや処理が行われている中、実際にゲームをプレイしている人が見るのは、カメラオブジェクトによって決められた範囲だけとなっています。
そのため、このカメラオブジェクトの使い方次第で、そのゲームの見せ方が大きく変わってきます。
カメラの位置と撮影範囲
カメラの位置と撮影範囲は、カメラオブジェクトを選択することで分かります。
ここでは、2Dゲームと3Dゲームに分けて、プロジェクト作成時に初めから用意されている「Main Camera」のカメラオブジェクトを見ていきます。
2Dゲームのカメラ

2Dゲームのカメラの位置は、上の画像のカメラマークが表示されている部分にあり、画面の手前側から撮影していて、白線で囲われている部分が実際に撮影されている範囲です。
例えば、以下のようにカメラの撮影範囲内に四角いオブジェクト、撮影範囲外に丸いオブジェクトを配置してみます。

この状態でゲームビューに切り替えると、四角いオブジェクトだけが表示され、丸いオブジェクトは実際のゲーム画面には表示されなくなります。

このように、カメラの撮影範囲の中だけがゲームとして表示されることになります。
また、カメラの位置や向きは、Transformコンポーネントで管理されており、位置はPosition、向きはRotationで指定することで、カメラの位置などを変えることができます。

カメラで撮影している範囲は、CameraコンポーネントにあるSizeで管理されていて、このSizeの値を変えることで撮影範囲を変更できます。

3Dゲームのカメラ

3Dゲームのカメラの位置は、上の画像の赤色で囲っている部分にあり、そこから撮影されている範囲が白線で表示されています。
例えば、カメラの撮影範囲内にキューブ型のオブジェクト、撮影範囲外に球形のオブジェクトを置き、

ゲームビューモードに切り替えてみると、

カメラの撮影範囲外の球形のオブジェクトは、ゲーム画面内に表示されなくなります。
2Dゲームと同じく、カメラの撮影位置はTransformコンポーネントのPosition、カメラの向きはRotationで管理されています。
また、カメラで撮影する範囲は、Field of Viewという視野角を決める項目で設定することができます。

Unityのカメラオブジェクトでできること
Unityのカメラオブジェクトは、通常のオブジェクトと同じくスクリプトをアタッチして処理を加えることで、実際のカメラを撮影している動きを作り出すことができます。
そこでここからは、Unityのカメラオブジェクトを使ってどんなことができるのかを一部紹介していきます。
カメラの移動
カメラの位置を移動させて、ゲームに動きを作り出すことができます。
アクションゲームで多い自動スクロールのステージや、プレイヤーの動きに合わせてゲーム画面を移動させるといった仕組みを、カメラの移動によって作ることができます。
カメラの位置は、Transformコンポーネントの座標で管理されているので、この座標をスクリプトから変更してあげることで、カメラの移動処理が作れます。
例えば、2Dゲームでカメラを自動で移動させてスクロールさせたい場合、
using UnityEngine;
public class CameraController : MonoBehaviour
{
void Update()
{
transform.Translate(0.01f, 0, 0);
}
}
Updateメソッド内の7行目で、transform.Translateメソッドを使ってカメラの座標の位置をフレーム毎に移動させてあげることで、ゲーム画面を自動でスクロールさせることができます。

ズームイン・ズームアウト(拡大・縮小)
カメラで撮影しているものを拡大するズームインや、反対に縮小するズームアウトも行うことができます。
カメラから少し離れた位置にオブジェクト(被写体)があり、それを拡大してより詳細を見せたいといった場合に使えます。
ズームインやズームアウトを行う場合は、CameraコンポーネントのProjectionにある2Dなら「Size」、3Dなら「Field of View」の値を変更することでできます。
using UnityEngine;
public class CameraController : MonoBehaviour
{
Camera cam;
void Start()
{
cam = GetComponent<Camera>(); // Cameraコンポーネントを取得
}
void Update()
{
if (Input.GetMouseButton(0))
{
cam.fieldOfView -= 0.05f; // 数値を減らして拡大する
}
else if (Input.GetMouseButton(1))
{
cam.fieldOfView += 0.05f; // 数値を増やして縮小する
}
}
}
9行目でGetComponentメソッドを使って、Cameraコンポーネントを取得しています。
そして、16行目でField of Viewの数値を減らすことで、マウスの左クリックを押している間はズームインさせて、20行目でField of Viewの数値を増やすことで、マウスの右クリックを押している間はズームアウトさせるようにしています。

パン・ティルト(回転)
カメラを水平方向に回転させて撮影するパンや、垂直方向に回転させて撮影するティルトの技法も、スクリプトから行うことができます。
ゲーム内に新しい登場人物が出てきたり、広大なフィールドを見せたい時などに、パンやティルトを使うことで効果的に表現することができます。
このカメラの回転は、TransformコンポーネントのRotationで管理されていて、この値を変更していくことで、パンやティルトを行うことができます。
ここでは、キーボードの十字キーに合わせてカメラが回転する処理を作ってみます。
using UnityEngine;
public class CameraController : MonoBehaviour
{
void Update()
{
if (Input.GetKey(KeyCode.LeftArrow))
{
transform.Rotate(0, 0.05f, 0); // Yの回転を加算する
}
else if (Input.GetKey(KeyCode.RightArrow))
{
transform.Rotate(0, -0.05f, 0); // Yの回転を減算する
}
else if (Input.GetKey(KeyCode.UpArrow))
{
transform.Rotate(0.05f, 0, 0); // Xの回転を加算する
}
else if (Input.GetKey(KeyCode.DownArrow))
{
transform.Rotate(-0.05f, 0, 0); // Xの回転を減算する
}
}
}
パンの処理として、9行目に左矢印キーを押したらRotate関数でRotationのYの値を加算させて、13行目で右矢印キーを押したら減算させる処理を行っています。
また、ティルトの処理として、17行目に上矢印キーを押したらrotationのXの値を加算させて、21行目で下矢印キーを押したら減算させる処理を行っています。

なお、
と言います。
視点の切り替え
カメラオブジェクトを複数作成することで、ゲーム内での視点の切り替えを行うことができます。
新たにカメラオブジェクトを作成する場合は、ヒエラルキーウィンドウの+ボタンから「Camera」を選択して作成できます。

ここでは、例えば、通常のメインカメラ(Camera0)とは別に、上から撮影するカメラ(Camera1)、横から撮影するカメラ(Camera2)を配置して、視点の切り替えを行ってみます。



using UnityEngine;
public class CameraSwitcher : MonoBehaviour
{
public GameObject[] cameraObject; // カメラオブジェクトを取得する
void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha0) && cameraObject[0].activeSelf == false)
{
cameraObject[0].SetActive(true);
cameraObject[1].SetActive(false);
cameraObject[2].SetActive(false);
}
else if (Input.GetKeyDown(KeyCode.Alpha1) && cameraObject[1].activeSelf == false)
{
cameraObject[0].SetActive(false);
cameraObject[1].SetActive(true);
cameraObject[2].SetActive(false);
}
else if (Input.GetKeyDown(KeyCode.Alpha2) && cameraObject[2].activeSelf == false)
{
cameraObject[0].SetActive(false);
cameraObject[1].SetActive(false);
cameraObject[2].SetActive(true);
}
}
}
5行目でGameObject型の変数を作成して、その変数にそれぞれのカメラオブジェクトをインスペクターウィンドウから入れておきます。
そして、9行目以降でそれぞれのカメラオブジェクトに対して、SetActive関数を使って、アクティブにするカメラを切り替える処理を書いています。
キーボードの「0」を押したら「Camera0」がアクティブになり、「1」を押したら「Camera1」、「2」を押したら「Camera2」がアクティブになるようにして、それ以外のカメラを非アクティブになるように書いています。
これで実際にゲームを実行してみると、

キーボードの「0」「1」「2」のボタンを押すとアクティブ状態のカメラを切り替えることができ、視点の切り替えができるようになりました。
まとめ
このページでは、Unityのカメラについて、どんな役割があるのか、またどんなことができるのかまとめていきましたが、いかがでしたでしょうか?
カメラオブジェクトは、ゲームを画面に表示させる範囲を決めているオブジェクトです。
ゲーム内をカメラマンが撮影しているように、このカメラで撮影した部分だけが実際にゲームで表示されます。
カメラオブジェクトは、スクリプトをアタッチすることができるので、カメラを移動させたり、拡大・縮小や向きを変えたり、他にもピントをずらしたりなど様々なことができます。
最後までお読みいただきまして、ありがとうございました!
コメント