Troca de mapas de luz Unity para obter efeitos noturnos e diurnos

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;
  1. lightmapDatas = new LightmapData[lightmapTex.Length];: Cria lightmapTexuma LightmapDatamatriz com o mesmo comprimento da matriz lightmapDatas.
  2. LightmapData lmd = new LightmapData(); Crie um novo LightmapDataobjetolmd
  3. lmd.lightmapColor = lightmapTex[i];: Atribua os elementos lightmapTexda matriz lmdà lightmapColorpropriedade de , ou seja, defina o mapa de cores do mapa de luz.
  4. lmd.lightmapDir = lightmapDir[i];: Atribua os elementos lightmapDirda matriz à propriedadelmd de , ou seja, defina o mapa de direção do mapa de luz.lightmapDir
  5. lightmapDatas[i] = lmd;: Atribua lmdo valor à lightmapDatasposição de índice correspondente da matriz e conclua o preenchimento lightmapDatasda matriz .
  6. LightmapSettings.lightmaps = lightmapDatas; Atribua a lightmapDatasmatriz LightmapSettings.lightmapspara aplicar o novo mapa de luz.

pode ser alcançado como acima

Acho que você gosta

Origin blog.csdn.net/leikang111/article/details/131226776
Recomendado
Clasificación