WisdomSoft - for your serial experiences.

照明の種類

照明の形は照明の種類で設定できます。既定では照明オブジェクトの位置から均等の距離で球体状に照らすポイントライトが設定されていますが、例えばスポットライトに変更することで円錐状の照明に変更できます。

照らし方を設定する

既定の設定では、照明は一定範囲にある周囲のオブジェクトを照らすポイントライトと呼ばれる種類です。これは、部屋の中にある標準的な照明を模倣するもので、照明は全方位でオブジェクトを照らし、照明に近いものほど強く照らします。部屋の内部や、街灯などで利用できますが、一方で太陽による自然光のような、フィールド全体を照らす光には向いていません。

照明には、既定のポイントライト以外に複数の種類があります。照明の種類によって、光の当て方が変わるため、光源によって適切な種類を設定する必要があります。照明の種類を設定するには Light クラスの LightType プロパティを変更します。

Light クラス LightType プロパティ
public LightType type { get; set; }

このプロパティは、照明の種類を表す UnityEngine.LightType 列挙型のいずれのメンバを設定または取得します。

UnityEngine.LightType 列挙型
public enum LightType

この列挙型は、照明の種類を表す値を提供します。Light コンポーネントは type プロパティに設定されている LightType 値によって、照明の種類や、その種類で有効になるパラメータが決定されます。

type プロパティの既定の値は、ポイントライトを表す Point メンバです。この他に、照明の位置から特定の方向を円錐状に照らすスポットライトを表すには Spot メンバを指定し、位置や距離と無関係に、特定の向きに対して均等に光を放射するディレクションライトを設定するには Directional メンバを指定します。

特定の位置からの照射ではなく、四角形の範囲で照射するエリアライトには Area メンバを用います。エリアライトは柔らかくリアリティのある光の演出に用いられますが、演算の負荷が高くリアルタイムでの描画には適していません。また、エリアライトを利用できるのは Pro ライセンスのみです。

図1 ポイントライト
図1 ポイントライト
図2 スポットライト
図2 スポットライト
図3 ディレクションライト
図3 ディレクションライト

ゲームでは、これらのライトを組み合わせて空間を表現します。屋外であれば自然光としてディレクションライトを使い、室内などであればポイントライトやスポットライトを使って空間を照らします。複数の光を組み合わせてオブジェクトを照らせますが、当然、照明を増やせば計算量が増えます。基本的に、シーン内においてオブジェクトに当たる照明は、多くても 1 つのディレクションライトと、1 ~ 2 程度の照明に留めるべきでしょう。

ちなみに、同一のオブジェクトに当てられる照明の数には限界があり、周囲に複数の照明にあっても反映されるのは有効な照明の数に限ります。この、オブジェクトに対して有効な照明の数は、「Edit」メニューの「Project Settings」→「Quality」メニュー項目を選択し、表示された「QualitySetting」ウィンドウ内の「Pixel Light Count」項目で設定できます。

図4 Pixel Light Count
図3 Pixel Light Count

もし、ゲーム中で照明が予期せずに消える現象が発生した場合、照明の数を疑ってみると良いでしょう。

コード1
using System;
using UnityEngine;

public sealed class Sample : MonoBehaviour
{
    private Light _light;

    void Start()
    {
        camera.transform.position = new Vector3(0, 0, -3);
        var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        cube.transform.localScale = new Vector3(10, 10, 1);

        var lightObject = new GameObject("Light");
        lightObject.transform.position = new Vector3(3, 3, -3);
        lightObject.transform.LookAt(Vector3.zero);
        _light = lightObject.AddComponent<Light>();

        _light.type = LightType.Spot;
    }
}
実行結果
コード1 実行結果

コード1はスクリプトで生成した Light コンポーネントをスポットライトに変更しています。スポットライトは、オブジェクトの位置から、オブジェクトが向いている方向に円錐状の光を放射します。実行結果を見ると、これまでのポイントライトとは異なり、照明の位置から原点に向かって指向性のある光であることが確認できます。