Existe um requisito de que a luz em tempo real não pode ser usada para controlar dinamicamente o interruptor de luz, mas o efeito do dia e da noite deve ser alcançado.Existem cerca de uma dúzia de fontes de luz pontuais e luzes paralelas em minha cena.
Etapas de implementação:
1. Copie o modelo original para outra cena (porque a textura só pode existir na pasta da cena atual)
2. Depure o efeito do dia e da noite em cenas diferentes, crie dois conjuntos de texturas, preste atenção se as texturas cozidas são do tipo Dir e do tipo Linght
Então, por que existem os dois tipos a seguir? O motivo é que, quando o Unity concluir o cozimento do mapa de luz, de acordo com diferentes configurações, serão gerados até três mapas de luz diferentes. Aquele que termina com _light é o mapa de luz, aquele que termina com _dir é o mapa de direção da luz paralela e aquele que termina com _shadowmask é o mapa do canal de sombra de ShadowMask. Por enquanto, focamos apenas no mapa de luz no final de _light e _dir
3. Na cena em que a troca de textura é necessária, crie uma chave de controle e monte o seguinte script
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;
}
}
*Observe que esses quatro arrays representam suas texturas na noite e no dia, respectivamente, e são divididos nos tipos Dir e Light. Atribua os tipos correspondentes de texturas nas capturas de tela acima aos seguintes arrays
public Texture2D[] lightmapDark;
public Texture2D[] lightmapDarkDir;
public Texture2D[] lightmapLight;
public Texture2D[] lightmapLightDir;
*LightmapData[] lightmapDatas é o grupo de informações de iluminação
* Explique o seguinte roteiro
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];
: CrialightmapTex
umaLightmapData
matriz com o mesmo comprimento da matrizlightmapDatas
.LightmapData lmd = new LightmapData();
Crie um novoLightmapData
objetolmd
lmd.lightmapColor = lightmapTex[i];
: Atribua os elementoslightmapTex
da matrizlmd
àlightmapColor
propriedade de , ou seja, defina o mapa de cores do mapa de luz.lmd.lightmapDir = lightmapDir[i];
: Atribua os elementoslightmapDir
da matriz à propriedadelmd
de , ou seja, defina o mapa de direção do mapa de luz.lightmapDir
lightmapDatas[i] = lmd;
: Atribualmd
o valor àlightmapDatas
posição de índice correspondente da matriz e conclua o preenchimentolightmapDatas
da matriz .LightmapSettings.lightmaps = lightmapDatas;
Atribua alightmapDatas
matrizLightmapSettings.lightmaps
para aplicar o novo mapa de luz.
pode ser alcançado como acima