有这么一个需求,不能使用实时光来进行动态控制光照开关,但是又要实现白天和黑夜的效果,我的场景中有大概十几个点光源和平行光
实现步骤:
一、模型原模原样复制到另一个场景中(因为贴图只能存在于当前的场景文件夹)
二、在不同的场景中调试白天和黑夜的效果,烘焙两套贴图,注意烘焙出来的贴图有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;
lightmapDatas = new LightmapData[lightmapTex.Length];
:创建一个具有与lightmapTex
数组相同长度的LightmapData
数组lightmapDatas
。LightmapData lmd = new LightmapData();
在每次迭代中创建一个新的LightmapData
对象lmd
lmd.lightmapColor = lightmapTex[i];
:将当前迭代中的lightmapTex
数组元素赋值给lmd
的lightmapColor
属性,即设置光照贴图的颜色贴图。lmd.lightmapDir = lightmapDir[i];
:将当前迭代中的lightmapDir
数组元素赋值给lmd
的lightmapDir
属性,即设置光照贴图的方向贴图。lightmapDatas[i] = lmd;
:将当前迭代中的lmd
赋值给lightmapDatas
数组的对应索引位置,完成对lightmapDatas
数组的填充。LightmapSettings.lightmaps = lightmapDatas;
将填充后的lightmapDatas
数组赋值给LightmapSettings.lightmaps
,以应用新的光照贴图。
如上即可实现