Unity光照贴图的切换,实现黑夜和白天效果

有这么一个需求,不能使用实时光来进行动态控制光照开关,但是又要实现白天和黑夜的效果,我的场景中有大概十几个点光源和平行光

实现步骤:

一、模型原模原样复制到另一个场景中(因为贴图只能存在于当前的场景文件夹)

二、在不同的场景中调试白天和黑夜的效果,烘焙两套贴图,注意烘焙出来的贴图有Dir类型也有Linght类型的

那为什么会出现如下两种类型呢?原因是当Unity完成了光照贴图的烘焙时,按照不同的设置,最多会生成三种不同的光照贴图。其中以_light结尾的是光照贴图,以_dir结尾的是平行光的方向图,以_shadowmask结尾的是ShadowMask的阴影通道图。我们暂时先只关注_light和_dir结尾的光照图

 三、在需要进行贴图切换的场景中,创建一个控制开关,挂载如下脚本

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using DG.Tweening;

/// <summary>
/// 该脚本用于控制光照贴图和光照开关
/// </summary>
public class LightingSwitchBtn : MonoBehaviour,IPointerClickHandler
{
    public bool IsTurnOn = false;
    public GameObject CircleSlider;

    // / <summary>
    // / 光照信息
    // / </summary>
    LightmapData[] lightmapDatas;

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

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

    void Awake()
    {
    }
    public void OnPointerClick(PointerEventData eventData)
    {
        SwichState();
    }
    public void SwichState()
    {
        bool ClickState = !IsTurnOn;
        if (ClickState)
        {
            gameObject.GetComponent<Image>().color = Color.blue;
            CircleSlider.transform.DOLocalMoveX(16.7f, 0.2f);
            SetLightMap(lightmapLight,lightmapDarkDir);
        }
        else
        {
            gameObject.GetComponent<Image>().color = Color.white;
            CircleSlider.transform.DOLocalMoveX(-16.7f, 0.2f);

            SetLightMap(lightmapDark,lightmapDarkDir);
        }
        IsTurnOn = ClickState;
    }

    /// <summary>
    /// 替换所有贴图
    /// </summary>
    /// <param name="lightmapTex"></param>
    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;
    }
}

*注意这四个数组分别代表你在黑夜和白天下的贴图,分成了Dir和Light类型的,分别将我上述截图中对应类型的贴图赋值给如下数组

  public Texture2D[] lightmapDark;
  public Texture2D[] lightmapDarkDir;

  public Texture2D[] lightmapLight;
  public Texture2D[] lightmapLightDir;

*LightmapData[] lightmapDatas是光照信息组

*解释一下如下脚本

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;
  1. lightmapDatas = new LightmapData[lightmapTex.Length];:创建一个具有与 lightmapTex 数组相同长度的 LightmapData 数组 lightmapDatas
  2. LightmapData lmd = new LightmapData(); 在每次迭代中创建一个新的 LightmapData 对象 lmd
  3. lmd.lightmapColor = lightmapTex[i];:将当前迭代中的 lightmapTex 数组元素赋值给 lmdlightmapColor 属性,即设置光照贴图的颜色贴图。
  4. lmd.lightmapDir = lightmapDir[i];:将当前迭代中的 lightmapDir 数组元素赋值给 lmdlightmapDir 属性,即设置光照贴图的方向贴图。
  5. lightmapDatas[i] = lmd;:将当前迭代中的 lmd 赋值给 lightmapDatas 数组的对应索引位置,完成对 lightmapDatas 数组的填充。
  6. LightmapSettings.lightmaps = lightmapDatas; 将填充后的 lightmapDatas 数组赋值给 LightmapSettings.lightmaps,以应用新的光照贴图。

如上即可实现

猜你喜欢

转载自blog.csdn.net/leikang111/article/details/131226776