Unity 光照贴图切换失效的问题2018

变更光照贴图的写法

我们使用LightmapSettings.lightmaps设置场景中的光照贴图的信息。LightmapSetting的结构如下:

[NativeHeader("Runtime/Graphics/LightmapSettings.h")]
[StaticAccessor("GetLightmapSettings()")]
public sealed class LightmapSettings : Object
{
   //光照贴图
    public static LightmapData[] lightmaps { get; set; }	      
    //光照模式
    public static LightmapsMode lightmapsMode { get; set; }
    //光照探针
    public static LightProbes lightProbes { get; set; }
}	   
[NativeHeader("Runtime/Graphics/LightmapData.h")]
[UsedByNativeCode]
public sealed class LightmapData
{
    public LightmapData();
    public Texture2D lightmapColor { get; set; }
    public Texture2D lightmapDir { get; set; }
    public Texture2D shadowMask { get; set; }
}

当有多场景共存的时候,多个场景的光照贴图是依次按照顺序排在一起的。如下
在这里插入图片描述
也就是说当我们需要更改LightmapSetting.lightmaps的一部分数据时,需要重新对LightmapSetting.lightmaps复制,单独改变某一个数据(比如:LightmapSetting.lightmaps[0])是无法修正的。

public class ShadowMapTest : MonoBehaviour
{
    public Texture2D lightMap;

    private void OnGUI()
    {
        if (GUI.Button(new Rect(50,50,30,30),"切换单个图片"))
        {
           //--这种操作方式是无效的,并不会完成数据修改,虽然都是引用类型,不知道unity内部做了什么处理
            LightmapSettings.lightmaps[0].lightmapColor = lightMap;
        }
        if (GUI.Button(new Rect(50, 100, 30, 30), "全部切换"))
        {
          //--虽然只是替换第一个贴图,我们需要重新创建一个数组,然后复制,修改新数组的数据,之后赋值,
          //--光照贴图的替换才会生效
            LightmapData[] data = new LightmapData[LightmapSettings.lightmaps.Length];
            LightmapSettings.lightmaps.CopyTo(data, 0);
            data[0].lightmapColor = lightMap;
            LightmapSettings.lightmaps = data;
        }
    }
}

原因分析

为什么需要全部修改才可以替换成功,因为在底层,每次调用LightmapSettings.lightmaps的get方法,都会给我们返回一个新的数组,所以在使用时我们需要注意效率,不用额外new数组。比如下面可以进行优化

//--这是上面的切换成功的代码
if (GUI.Button(new Rect(50, 100, 30, 30), "全部切换"))
  {
        LightmapData[] data = new LightmapData[LightmapSettings.lightmaps.Length];
        LightmapSettings.lightmaps.CopyTo(data, 0);
        data[0].lightmapColor = lightMap;
        LightmapSettings.lightmaps = data;
    }
    //--更改为如下方式,可以优化
  if (GUI.Button(new Rect(50, 100, 30, 30), "全部切换"))
  {
        //--获取到这个数组,这个数组是一个新的数组,我们直接更改即可
        //--但是不能LightmapSettings.lightmaps[0].lightmapColor = lightMap这样修改,不明白为什么,从头看一遍
        LightmapData[] data = LightmapSettings.lightmaps;
        data[0].lightmapColor = lightMap;
        LightmapSettings.lightmaps = data;
    }

猜你喜欢

转载自blog.csdn.net/u010778229/article/details/117674241