您的位置:首页 > 移动开发 > Unity3D

Unity 全局光照LightMap 动态加载

2016-01-11 11:03 1771 查看
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的贴图也丢了。

如有疑问,请回复哦~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity 脚本