【Unity】MainCameraのタグでコンポーネントを簡単に取得できる仕組み

MainCameraとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「UnityのMainCameraってなに?」

「MainCameraを使うとどんなメリットがあるの?」

というお悩みの方に向けた内容となっています。

Unityでプロジェクトを新しく立ち上げた際に、シーン内にデフォルトで「Main Camera」というカメラオブジェクトが設置されています。

このMain Cameraは、タグで「MainCamera」を指定していて、スクリプトから「Camera.main」と書くだけで、Cameraコンポーネントを取得することができる機能があります。

これを使えば、Cameraコンポーネントを取得する記述がいらないので、よりスクリプトを短縮して書くことができます。

そこで、このページでは、Unityで使われるMainCameraのタグ機能について、仕様や特徴をまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

MainCameraの仕様・特徴

Main Cameraは、ゲーム内を表示するためのカメラオブジェクトで、プロジェクト立ち上げ時にデフォルトで配置されています。

MainCameraのタグが設定されている

初めから配置されているMainCameraは、同じく「MainCamera」というタグ設定をしているカメラオブジェクトとなっています。

Unityでは、このタグを使って、そのオブジェクトがどういうオブジェクトなのかを判別することができるようになっています。

タグ設定は、インスペクターウィンドウから設定・確認することができ、実際にMain Cameraを選択してみると、以下のように「MainCamera」というタグが紐づいています。

このMainCameraのタグが設定されているカメラは、この後紹介する「Camera.main」で簡単にCameraコンポーネントにアクセスできるようになります。

ちなみに、Main Cameraのオブジェクトを誤って消去してしまったり、別のカメラをMainCameraにしたい場合は、新しくカメラオブジェクトを配置して、タグ設定でMainCameraを指定すれば問題ありません。

Camera.mainでコンポーネントを取得

カメラオブジェクトでMainCameraのタグを設定している場合は、スクリプトから「Camera.main」と書くことで、簡単にそのカメラオブジェクトのコンポーネントにアクセスすることができます。

通常、MainCameraのタグ設定がされていないカメラは、スクリプトからCameraコンポーネントを使う場合、GetComponentメソッドなどでコンポーネントを取得する必要があります。

例えば、カメラでズーム処理を行う場合、

using UnityEngine;

public class CameraController : MonoBehaviour
{
    Camera cam;

    void Start()
    {
        cam = GetComponent<Camera>();   // Cameraコンポーネントを取得する
    }

    void Update()
    {
        if (Input.GetKey(KeyCode.Space))
        {
            cam.fieldOfView -= 0.02f;
        }
    }
}

上記の9行目のように、先にGetComponentメソッドなどでCameraコンポーネントを取得してから、処理を書いていく必要があります。

しかし、MainCameraのタグ設定がされているカメラの場合は、「Camera.main」でコンポーネントにアクセスすることができるため、

using UnityEngine;

public class CameraController : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKey(KeyCode.Space))
        {
            Camera.main.fieldOfView -= 0.02f;
        }
    }
}

上記のように、GetComponentメソッドなどを使う必要がなく、9行目でCamera.mainと書いて簡単にアクセスすることができます。

このように、カメラオブジェクトにMainCameraのタグが設定されている場合は、スクリプトから簡単にCameraコンポーネントを使うことができます。

MainCameraが複数ある場合は最初に検出されたカメラが対象

では、複数のカメラオブジェクトにMainCameraのタグ設定がされている場合は、どのカメラのコンポーネントにアクセスすることになるのでしょうか?

MainCameraが複数ある場合は、ステータスが有効なカメラの中で、最初に検出されたカメラを取得することになり、どのカメラが取得されるかわからないので、複数のカメラにMainCameraのタグを設定するのは控えたほうが良さそうです。

実際に、以下のように試してみました。

MainCameraのタグを設定した3つのカメラを準備して、一番初めに配置したカメラを二番目に配置したカメラを真ん中三番目に配置したカメラを、にそれぞれの映像が表示されるように、Render Textureを設定しています。

そして、空のオブジェクトを作成して、以下のようにスペースキーを押すとMainCameraがズームするようなスクリプトをアタッチしてあげます。

using UnityEngine;

public class CameraController : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKey(KeyCode.Space))
        {
            Camera.main.fieldOfView -= 0.02f;
        }
    }
}

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

右のカメラだけがズームされているので、ここでは一番最後に配置したカメラがCamera.mainで取得できているのがわかります。

ただし、状況次第で取得できるカメラが変わるかもしれないので、複数のカメラにMainCameraを設定するのは控えておきましょう。

まとめ

このページでは、Unityでカメラオブジェクトに設定できるMainCameraのタグについて、どんな仕様や特徴があるのかをまとめていきましたが、いかがでしたでしょうか?

カメラオブジェクトに「MainCamera」のタグを設定すると、「Camera.main」の記述だけでそのCameraコンポーネントに簡単にアクセスすることができるようになります。

Cameraコンポーネントを使ったズーム処理や、MainCameraのオブジェクトを取得したい場合などに、非常に便利に使うことができます。

ただし、MainCameraは一つのカメラしか取得できないため、複数のカメラに設定するのは止めておいたほうが良いでしょう。

最後までお読みいただきまして、ありがとうございました!

コメント