WisdomSoft - for your serial experiences.

画面分割

同一シーン内に複数のカメラを追加することができ、画面内に複数のカメラの映像を描画できます。カメラによって映し出されたゲーム画面をスクリーン上のどの位置に表示するか、その範囲を設定でき、これによって画面分割が可能です。

ビューポート

カメラによって映し出されたゲーム画面は、既定の設定ではデバイス(ディスプレイ)全体に描画されます。つまり、ゲームが持つウィンドウの全領域にカメラの映像を描画します。この設定も変更することができます。

カメラが映した(描画された)ゲーム画面を、どの範囲に表示するかは Camera クラスの rect プロパティから設定できます。この範囲のことを、一般にビューポートと呼びます。

Camera クラス rect プロパティ
public Rect rect { get; set; }

このプロパティは、カメラが描画した結果を表示するスクリーン上の長方形領域を表します。x 座標と y 座標は、ぞれぞれ 0.0 ~ 1.0 の範囲で表し、原点は左下、1.0 が右上となります。例えば x プロパティが 0.0、width プロパティが 0.5 であれば、画面左から中央までの範囲を表すことになります。ピクセル単位ではないため、スクリーンの解像度には依存しません。

コード1
using UnityEngine;

public sealed class Sample : MonoBehaviour
{
    void Start()
    {
        GameObject obj = new GameObject();
        Camera camera = obj.AddComponent<Camera>();
        camera.rect = new Rect(0.25F, 0.5F, 0.25F, 0.25F);
    }
}
実行結果
コード1 実行結果

コード1はスクリーンの一部にだけカメラが描画したフレームを表示するスクリプトです。実行結果の黒い部分は何も描画されていない領域で、青い(カメラの既定の背景色)で塗りつぶされている長方形がゲーム画面です。このように、カメラが映しだした結果を、スクリーンの一部に伸縮させて描画することができます。

これを応用することで、スクリーン上に複数の画面を表示できます。Camera コンポーネントはシーン内に複数配置できるので、複数のカメラの結果を画面分割で表示できます。一般的なゲームで見られるマルチプレイの画面分割や、キャラクター視点と鳥観視点などの組み合わせが可能となります。

コード2
using UnityEngine;

public sealed class Sample : MonoBehaviour
{
    void Start()
    {
        GameObject obj1 = new GameObject("Camera(Left)");
        Camera camera1 = obj1.AddComponent<Camera>();
        camera1.rect = new Rect(0, 0, 0.5F, 1);
        camera1.backgroundColor = Color.blue;

        GameObject obj2 = new GameObject("Camera(Right)");
        Camera camera2 = obj2.AddComponent<Camera>();
        camera2.rect = new Rect(0.5F, 0, 0.5F, 1);
        camera2.backgroundColor = Color.red;
    }
}
実行結果
コード2 実行結果

コード2は異なる 2 つのゲームオブジェクトを作成し、これらに Camera コンポーネントを追加しています。一方のカメラの背景色は青に、もう一方のカメラの背景色を赤に設定し、画面中央で分割しています。青のカメラは X 座標 0.0 から水平方向に 0.5 の長さ(すなわち画面左から中央までの範囲)で描画され、赤のカメラは X 座標 0.5 から水平方向に 0.5 の長さ(すなわち画面中央から右までの範囲)で描画しています。

それぞれのカメラは独立しているため、異なる位置、異なる設定でゲーム世界を映し、その結果を別々に画面に出力できます。ただし、設定自体は難しいものではありませんが、個々のカメラの描画処理には多くの計算コストが必要になるため、ゲームの規模にもよりますが多様は避けるべきでしょう。ゲームにおける処理の大部分は描画処理であり、如何に描画回数を少なくするかがパフォーマンス改善に繋がります。