MRが楽しい

MRやVRについて学習したことを書き残す

Unityで環境光のライティングをスクリプトから変更する

本日は Unity の技術調査枠です。
Unityで環境光のライティングをスクリプトから変更する方法を記事にします。
f:id:bluebirdofoz:20190607091609j:plain

環境光のライティングの説明については以下の記事を参照ください。
bluebirdofoz.hatenablog.com

環境光のAPI

スクリプトから環境光を変更するには UnityEngine.RenderSettings を利用します。
docs.unity3d.com

単色カラー、方向指定カラー、スカイボックスの環境光を切り替えるスクリプトを以下の通り作成してみました。
・EnvironmentController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 環境光のモード定義のため利用
using UnityEngine.Rendering;

public class EnvironmentController : MonoBehaviour {

    /// <summary>
    /// 環境光の定義
    /// </summary>
    public enum EnvironmentLightMode
    {
        Color, Gradient, Skybox
    }

    /// <summary>
    /// 環境光変更テスト用Inspector変数
    /// </summary>
    public EnvironmentLightMode setLightMode = EnvironmentLightMode.Color;

    /// <summary>
    /// スカイボックスとして利用するマテリアル
    /// </summary>
    public Material SkyboxMaterial;

    /// <summary>
    /// 現在の環境光
    /// </summary>
    private EnvironmentLightMode lightMode;

    /// <summary>
    /// 初期設定
    /// </summary>
    void Start () {
        // 環境光の設定を行う
        RenderSetting_Color();
    }
    
    /// <summary>
    /// 定期実行
    /// </summary>
    void Update () {
        // Inspectorで指定モードが変更されれば環境光を切り替える
        if (lightMode != setLightMode)
        {
            switch(setLightMode)
            {
                case EnvironmentLightMode.Color:
                    RenderSetting_Color();
                    break;
                case EnvironmentLightMode.Gradient:
                    RenderSetting_Gradient();
                    break;
                case EnvironmentLightMode.Skybox:
                    RenderSetting_Skybox();
                    break;
                default:
                    break;
            }
        }
    }

    /// <summary>
    /// 環境光に単色カラー設定を利用する
    /// </summary>
    public void RenderSetting_Color()
    {
        // 環境光のライティング設定
        // ソースをFlatに変更する
        RenderSettings.ambientMode = AmbientMode.Flat;
        // 環境光の色を指定する
        RenderSettings.ambientLight = Color.blue;

        // 環境光の反射設定
        // ソースをCustomに変更する
        RenderSettings.defaultReflectionMode = DefaultReflectionMode.Custom;
        // 反射に利用するキューブマップの指定を外す
        RenderSettings.customReflection = null;
        // 反射の回数を1に設定する
        RenderSettings.reflectionBounces = 1;

        // 現在の環境光の定義
        lightMode = EnvironmentLightMode.Color;
    }

    /// <summary>
    /// 環境光に指定カラー設定を利用する
    /// </summary>
    public void RenderSetting_Gradient()
    {
        // 環境光のライティング設定
        // ソースをFlatに変更する
        RenderSettings.ambientMode = AmbientMode.Trilight;
        // 環境光の上方向からの色を指定する
        RenderSettings.ambientSkyColor = Color.blue;
        // 環境光の横方向からの色を指定する
        RenderSettings.ambientEquatorColor = Color.green;
        // 環境光の下方向からの色を指定する
        RenderSettings.ambientGroundColor = Color.red;

        // 環境光の反射設定
        // ソースをCustomに変更する
        RenderSettings.defaultReflectionMode = DefaultReflectionMode.Custom;
        // 反射に利用するキューブマップの指定を外す
        RenderSettings.customReflection = null;
        // 反射の回数を1に設定する
        RenderSettings.reflectionBounces = 1;

        // 現在の環境光の定義
        lightMode = EnvironmentLightMode.Gradient;
    }

    /// <summary>
    /// 環境光にスカイボックスを利用する
    /// </summary>
    public void RenderSetting_Skybox()
    {
        // 環境光のライティング設定
        // ソースをSkyboxに変更する
        RenderSettings.ambientMode = AmbientMode.Skybox;
        // スカイボックスのマテリアルを設定する
        RenderSettings.skybox = SkyboxMaterial;
        // 光の強度を1に設定する
        RenderSettings.ambientIntensity = 1.0f;

        // 環境光の反射設定
        // ソースをSkyboxに変更する
        RenderSettings.defaultReflectionMode = DefaultReflectionMode.Skybox;
        // 解像度を設定する
        RenderSettings.defaultReflectionResolution = 128;
        // 反射の強度を1に設定する
        RenderSettings.reflectionIntensity = 1.0f;
        // 反射の回数を1に設定する
        RenderSettings.reflectionBounces = 1;
        
        // 環境光の更新(Skyboxマテリアル更新のため)
        DynamicGI.UpdateEnvironment();

        // 現在の環境光の定義
        lightMode = EnvironmentLightMode.Skybox;
    }
}

空のゲームオブジェクトを作成し、作成した EnvironmentController コンポーネントをアタッチします。
更に確認用に、マテリアルに異なる Metalic 値を設定した Sphere オブジェクトを配置しました。
f:id:bluebirdofoz:20190607091637j:plain

Unity上での動作確認

[再生]ボタンをクリックして UnityEditor 上で動作を確認します。
EnvironmentController コンポーネントの SetLightMode を変更すると、環境光が切り替わることが確認できます。
・Color
f:id:bluebirdofoz:20190607091646j:plain

・Gradient
f:id:bluebirdofoz:20190607091654j:plain

・Skybox
f:id:bluebirdofoz:20190607091703j:plain

尚、Game 画面に映り込んでいる Skybox は Camera コンポーネントに設定された背景設定です。
カメラ背景も変更したい場合は環境光だけでなく、Camera コンポーネントの設定を変更する必要があります。
f:id:bluebirdofoz:20190607091710j:plain