本日は Unity の技術調査枠です。
Unityで環境光のライティングをスクリプトから変更する方法を記事にします。
環境光のライティングの説明については以下の記事を参照ください。
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 オブジェクトを配置しました。