Unity中动态切换光照贴图的方法

发布于:2025-02-28 ⋅ 阅读:(143) ⋅ 点赞:(0)

关键代码:LightmapSettings.lightmaps = lightmapDatas;

LightmapData中操作三张图:lightmapColor,lightmapDir,以及一张ShadowMap

这里只操作前两张:

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class LightingSwitchBtn : MonoBehaviour
{
    public bool IsTurnOn = false;

    // / 光照信息
    LightmapData[] lightmapDatas;

    /// 暗的时候的贴图
    public Texture2D[] lightmapDark;
    public Texture2D[] lightmapDarkDir;

    /// 亮的时候的贴图
    public Texture2D[] lightmapLight;
    public Texture2D[] lightmapLightDir;

    void Awake()
    {
    }
    public void OnPointerClick()
    {
        Debug.Log("1111");
        SwichState();
    }
    public void SwichState()
    {
        Debug.Log("2222");
        bool ClickState = !IsTurnOn;
        if (ClickState)
        {
            SetLightMap(lightmapLight, lightmapLightDir);
        }
        else
        {
            SetLightMap(lightmapDark, lightmapDarkDir);
        }
        IsTurnOn = ClickState;
    }

    public void SetLightMap(Texture2D[] lightmapTex, Texture2D[] lightmapDir)
    {
        if (lightmapTex == null)
        {
            return;
        }
        lightmapDatas = new LightmapData[lightmapTex.Length];
        for (int i = 0; i < lightmapTex.Length; i++)
        {
            LightmapData lmd = new LightmapData();
            lmd.lightmapColor = lightmapTex[i];
            lmd.lightmapDir = lightmapDir[i];
            lightmapDatas[i] = lmd;
        }
        LightmapSettings.lightmaps = lightmapDatas;
    }

}

更新光照贴图后,还需要更新天空球,这里以HDRP管线为例,URP和build in同理:

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.UI;

public class LightingSwitchBtn : MonoBehaviour
{
    public bool IsTurnOn = false;

    LightmapData[] lightmapDatas;   /// 光照信息

    [Header("上午")] /// 亮的时候的贴图
    public Texture2D[] lightmapLightDir;
    public Texture2D[] lightmapLight;

    [Header("下午")]  /// 暗的时候的贴图
    public Texture2D[] lightmapDarkDir;
    public Texture2D[] lightmapDark;

    [Header("晚上")]/// 晚上的贴图
    public Texture2D[] lightmapNightDir;
    public Texture2D[] lightmapNight;

    [Header("天空")]
    public Texture SkyAM;
    public Texture SkyPM;
    public Texture SkyNight;
    [Header("Volume组件")]
    public Volume myVolume;
    public Texture mySkyTex;
    private HDRISky hdriSky;
    [Range(0,1)]
    public float TimeSwitch = 0;

    #region BoolIsTurnOn
    // public void SwichState()
    // {
    //     Debug.Log("啊啊啊");
    //     bool ClickState = !IsTurnOn;
    //     if (ClickState)
    //     {
    //         SetLightMap(lightmapLight, lightmapLightDir);
    //     }
    //     else
    //     {
    //         SetLightMap(lightmapDark, lightmapDarkDir);
    //     }
    //     IsTurnOn = ClickState;
    // }
    #endregion

    //天空切换
    void Awake()
    {
        VolumeProfile volumeProfile = myVolume.profile;
        volumeProfile.TryGet<HDRISky>(out hdriSky);
        mySkyTex = hdriSky.hdriSky.value;
    }
    //光照贴图切换
    public void AM_Time()
    {
        Debug.Log("AM");
        SetLightMap(lightmapLight, lightmapLightDir);
        hdriSky.hdriSky.value = SkyAM;
    }

    public void PM_Time()
    {
        Debug.Log("PM");
        SetLightMap(lightmapDark, lightmapDarkDir);
        hdriSky.hdriSky.value = SkyPM;
    }
    public void Night_Time()
    {
        Debug.Log("Night");
        SetLightMap(lightmapNight, lightmapNightDir);
        hdriSky.hdriSky.value = SkyNight;
    }
    public void SetLightMap(Texture2D[] lightmapTex, Texture2D[] lightmapDir)
    {
        if (lightmapTex == null)
        {
            return;
        }
        lightmapDatas = new LightmapData[lightmapTex.Length];
        for (int i = 0; i < lightmapTex.Length; i++)
        {
            LightmapData lmd = new LightmapData();
            lmd.lightmapColor = lightmapTex[i];
            lmd.lightmapDir = lightmapDir[i];
            lightmapDatas[i] = lmd;
        }
        LightmapSettings.lightmaps = lightmapDatas;
    }

}


网站公告

今日签到

点亮在社区的每一天
去签到