Commutation des lightmaps Unity pour obtenir des effets de nuit et de jour

Il y a une telle exigence que la lumière en temps réel ne peut pas être utilisée pour contrôler dynamiquement l'interrupteur d'éclairage, mais l'effet du jour et de la nuit doit être obtenu.Il y a environ une douzaine de sources lumineuses ponctuelles et de lumières parallèles dans ma scène.

Étapes de mise en œuvre :

1. Copiez le modèle d'origine dans une autre scène (car la texture ne peut exister que dans le dossier de scène actuel)

2. Déboguez l'effet du jour et de la nuit dans différentes scènes, faites cuire deux ensembles de textures, faites attention aux textures cuites sont de type Dir et de type Linght

Alors pourquoi y a-t-il les deux types suivants ? La raison en est que lorsque Unity termine la cuisson de la lightmap, selon différents paramètres, jusqu'à trois lightmaps différentes seront générées. Celui qui se termine par _light est la carte de lumière, celui qui se termine par _dir est la carte de direction de la lumière parallèle et celui qui se termine par _shadowmask est la carte du canal d'ombre de ShadowMask. Pour le moment, nous nous concentrons uniquement sur la light map à la fin de _light et _dir

 3. Dans la scène où la commutation de texture est requise, créez un commutateur de contrôle et montez le script suivant

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;
    }
}

* Notez que ces quatre tableaux représentent vos textures de nuit et de jour respectivement, et sont divisés en types Dir et Light. Attribuez les types de textures correspondants dans les captures d'écran ci-dessus aux tableaux suivants

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

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

*LightmapData[] lightmapDatas est le groupe d'informations sur l'éclairage

* Expliquez le script suivant

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];: Crée lightmapTexun LightmapDatatableau de la même longueur que le tableau lightmapDatas.
  2. LightmapData lmd = new LightmapData(); Créer un nouvel LightmapDataobjetlmd
  3. lmd.lightmapColor = lightmapTex[i];: attribuez les éléments du lightmapTextableau de lmdà lightmapColorla propriété de , c'est-à-dire définissez la carte de couleurs de la carte de lumière.
  4. lmd.lightmapDir = lightmapDir[i];: attribuez les éléments du lightmapDirtableau à la propriétélmd de , c'est-à-dire définissez la carte de direction de la carte de lumière.lightmapDir
  5. lightmapDatas[i] = lmd;: Affecte lmdla valeur à lightmapDatasla position d'index correspondante du tableau, et termine le remplissage du lightmapDatastableau .
  6. LightmapSettings.lightmaps = lightmapDatas; Attribuez le lightmapDatastableau LightmapSettings.lightmapsà pour appliquer la nouvelle lightmap.

peut être atteint comme ci-dessus

Je suppose que tu aimes

Origine blog.csdn.net/leikang111/article/details/131226776
conseillé
Classement