【Unity】ベイクしたライトの強さをプレイ中に変える

投稿者: | 2021-06-08

HDRPでIndirect Lighting Controllerを使って、プレイ中にライトマップの明るさを変える時に、ライトやマテリアルのエミッションの強さも変えてみました。

ライトはSphereと重なるように配置されていて、Sphereもエミッションで光らせています。HDRPではライトやエミッションの値の変え方が少し違います。

普通はライトの強さを変えるときに、スクリプトでLightコンポーネントの値を変えますが、HDRPでは「HDAdditionalLightData」コンポーネントを使います。

また、エミッションの強さはエミッションの色にかけ合わせる必要があります。

スライダーを作る

まず、値を変えるためのスライダーを作りました。

スライダーコンポーネントでは、最小値を0、最大値を1にして、デフォルト値は1にしました。

その下の、「On Value Changed」の+ボタンから、値を変えた時に呼ぶメソッドを設定します。左の欄にスクリプトを付けたゲームオブジェクトをドラッグアンドロップして、右のプルダウンからメソッドを選びます。

スクリプト

スクリプトには、Volumeコンポーネント、Lightコンポーネント、ライト用のメッシュレンダラーを付けたオブジェクトをそれぞれアタッチします。また、カラーピッカーでエミッションカラーを設定します。

スクリプトでは、Startメソッドで各コンポーネントを取得して、スライダーの値を変えたときに呼ぶメソッドでライトの強さなどを変えます。

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;

public class IndirectlightingTest : MonoBehaviour
{
    // ボリュームのオブジェクト
    [SerializeField] Volume m_Volume;
    IndirectLightingController indirectLightingController;

    // ライトのオブジェクト
    [SerializeField] GameObject m_LightObject;
    HDAdditionalLightData lightData;

    // メッシュレンダラーのオブジェクト
    [SerializeField] GameObject m_EmissiveObject;

    // エミッションの色
    [SerializeField] Color emissiveColor;
    Material mat;

    // Start is called before the first frame update
    void Start()
    {
        // コンポーネントを取得
        VolumeProfile profile = m_Volume.sharedProfile;
        if (!profile.TryGet(out indirectLightingController))
        {
            indirectLightingController = profile.Add<IndirectLightingController>(false);
        }
        
        lightData = m_LightObject.GetComponent<HDAdditionalLightData>();

        mat = m_EmissiveObject.GetComponent<Renderer>().material;
    }

    // スライダーの値が変わったときに呼ばれる
    public void OnValueChange(float value)
    {
        // 間接光の強さを変える
        indirectLightingController.indirectDiffuseLightingMultiplier.value = value;
        indirectLightingController.reflectionProbeIntensityMultiplier.value = value;

        // ライトの強さを変える
        lightData.intensity = Mathf.Lerp(0, 2000f, value);

        // エミッションの強さを変える
        mat.SetColor("_EmissiveColor", emissiveColor * Mathf.Lerp(0, 256f, value));
    }
}
参考:https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@12.0/manual/creating-and-editing-lights-at-runtime.html
https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@12.0/manual/adjusting-emissive-intensity-at-runtime.html

値を変えるメソッドの引数には、スライダーの0~1の値が渡されます。ライトやエミッションの強さでは、0から最大値までの値を得るために、Mathf.Lerpメソッドの第三引数にこの値を渡します。

// ライトの強さを変える
lightData.intensity = Mathf.Lerp(0, 2000f, value);

エミッションの強さでは、2の累乗の値を設定するようです。ここではインスペクタに表示されるエミッションの強さを8にするために、2の8乗の256にしました。

これで、ライトマップにベイクしたライトの明るさをプレイ中に変えられました。

コメントを残す

メールアドレスが公開されることはありません。