Unity 全局光照LightMap 动态加载

Unity5 里面, 当场景里的物体保存成Prefab之后,LightMap的信息就会丢失。Fuck。。

所以最后就写了个脚本,把每个Render里的lightmap纪录下来,当prefab实例化之后,重新设置。

上代码。。


相关设置:



注意事项:检查下是否勾选了 Static -> BatchingStatic ,如果勾选了,一定要去除勾选 !!!!!!

using UnityEngine;  
using System.Collections;  
using System.Collections.Generic;
using UnityEngine.Rendering;

public class PrefabLightmapData : MonoBehaviour {

	//LightMap信息
	[System.Serializable]  
	public struct RendererInfo  
	{  
		public Renderer     renderer;  
		public int          lightmapIndex;  
		public Vector4      lightmapOffsetScale;  
	}

	//场景中的Fog信息
	[System.Serializable]  
	public struct FogInfo  
	{  
		public bool         fog;  
		public FogMode      fogMode;  
		public Color        fogColor;
		public float        fogStartDistance;
		public float        fogEndDistance;
		public float 		fogDensity;
	}


	public FogInfo fogInfo;
	public List<RendererInfo> m_RendererInfo; 
	public List<Texture2D> lightmapNear;
	public List<Texture2D> lightmapFar;
	public LightmapData[] lightmapData;
	public LightmapsMode lightmapsMode;

	//地形的LightMap信息
	public Terrain terrain;
	public RendererInfo terrainRendererInfo;

	//设置光照信息
	[ContextMenu("SetUp")]
	public void SetUp(){  
		lightmapData = new LightmapData[lightmapNear.Count > lightmapFar.Count ? lightmapNear.Count : lightmapFar.Count];
		for(int i = 0; i < lightmapData.Length; i ++){
			lightmapData[i]=new LightmapData();
			lightmapData[i].lightmapFar = i < lightmapFar.Count ? lightmapFar[i] : null;
			lightmapData[i].lightmapNear = i < lightmapNear.Count ? lightmapNear[i] : null;
		}
		LightmapSettings.lightmapsMode = lightmapsMode;
		LightmapSettings.lightmaps=lightmapData;
		LoadLightmap();
		RenderSettings.fog = fogInfo.fog;
		RenderSettings.fogMode = fogInfo.fogMode;
		RenderSettings.fogColor = fogInfo.fogColor;
		RenderSettings.fogStartDistance = fogInfo.fogStartDistance;
		RenderSettings.fogEndDistance = fogInfo.fogEndDistance;
		RenderSettings.fogDensity = fogInfo.fogDensity;
	}

	//保存光照信息
	[ContextMenu("SaveData")]
	public void SaveData(){  
		SaveLightmap ();
	}
	
	public void SaveLightmap()
	{  
		fogInfo = new FogInfo ();
		fogInfo.fog = RenderSettings.fog;
		fogInfo.fogMode = RenderSettings.fogMode;
		fogInfo.fogColor = RenderSettings.fogColor;
		fogInfo.fogStartDistance = RenderSettings.fogStartDistance;
		fogInfo.fogEndDistance = RenderSettings.fogEndDistance;

		lightmapNear = new List<Texture2D>();
		lightmapFar = new List<Texture2D>();
		for(int i = 0; i < LightmapSettings.lightmaps.Length; i ++){
			LightmapData data = LightmapSettings.lightmaps[i];
			if(data.lightmapNear != null){
				lightmapNear.Add(data.lightmapNear);
			}

			if(data.lightmapFar != null){
				lightmapFar.Add(data.lightmapFar);
			}
		}
		m_RendererInfo = new List<RendererInfo> ();
		var renderers = GetComponentsInChildren<MeshRenderer>();  
		foreach (MeshRenderer r in renderers) {  
			if (r.lightmapIndex != -1) {  
				RendererInfo info = new RendererInfo();  
				info.renderer = r;  
				info.lightmapOffsetScale = r.lightmapScaleOffset;  
				info.lightmapIndex = r.lightmapIndex;  
				m_RendererInfo.Add(info);  
			}  
		}

		terrain = GetComponentInChildren<Terrain> ();
		if (terrain != null) {
			terrainRendererInfo = new RendererInfo();
			terrainRendererInfo.lightmapOffsetScale = terrain.lightmapScaleOffset;  
			terrainRendererInfo.lightmapIndex = terrain.lightmapIndex;  
		}
		lightmapsMode = LightmapSettings.lightmapsMode;
	}  
	
	public void LoadLightmap()  
	{  
		if (m_RendererInfo.Count <= 0) return;  

		if (terrain != null) {
			terrain.lightmapScaleOffset = terrainRendererInfo.lightmapOffsetScale;
			terrain.lightmapIndex = terrainRendererInfo.lightmapIndex;
		}

		foreach (var item in m_RendererInfo) {  
			item.renderer.lightmapIndex = item.lightmapIndex;  
			item.renderer.lightmapScaleOffset = item.lightmapOffsetScale;  
		}  
	}
}

当场景中LightMap烘培好了之后,在perfab根节点上面挂上这个脚本,右键-》 SaveData,之后apply prefab。

在运行时场景初始化完成之后。调用SetUp方法,即可挂载lightMap。


重点!!我遇上个问题,需要保持原来存在的渲染场景,assetbundle才的LightMap能正常。否则就不会有LightMap,希望谁来个提示。

如果把原来渲染lightmap的场景删了,那么在手机上就会加载不到。
我估摸着是因为assetbundle的时候,没有把lightmap的贴图打包进去,只保存了引用的关系。
所以如果场景删了,那么lightmap的贴图也丢了。

如有疑问,请回复哦~~



  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值