能搜到这的应该是被新的烘焙系统坑了少时间,4.x到5.x美术必须重新烘焙,关于美术的没什么说的,只有---重新烘焙!

  新的烘焙系统,为了兼容5.x的多场景编辑功能,将烘焙信息从mesh全部挪到了一个中间件xxx.assets,这个资源文件在5.x烘焙完成后和光照贴图存放在一起,然而关于这个资源文件,我是查来查去没有找到任何接口可以访问。

  只能百度谷歌,发现方案基本都是序列化,因为上面提到的烘焙信息没有在mesh中保存,而是一个鸡肋资源文件,发布时xxx.assets可以删了。

  序列化哪些数据,在编辑器面板能看到,在下面代码中也能看到。

  编辑器脚本PrefabLightmapDataEditor.cs:

 using UnityEngine;
using UnityEditor; public class PrefabLightmapDataEditor : Editor {
[MenuItem("Ojcgames Tools/保存该场景预制件的烘焙信息", false, )]
static void SaveLightmapInfoByGameObject()
{
GameObject go = Selection.activeGameObject; if(null == go)return; PrefabLightmapData data = go.GetComponent<PrefabLightmapData>();
if (data == null)
{
data = go.AddComponent<PrefabLightmapData>();
}
//save lightmapdata info by mesh.render
data.SaveLightmap(); EditorUtility.SetDirty(go);
//applay prefab
PrefabUtility.ReplacePrefab(go, PrefabUtility.GetPrefabParent(go), ReplacePrefabOptions.ConnectToPrefab);
}
}

  被绑定在预制件父级上的序列化脚本PrefabLightmapData.cs:

 using UnityEngine;
using System.Collections;
using System.Collections.Generic; public class PrefabLightmapData : MonoBehaviour
{
[System.Serializable]
struct RendererInfo
{
public Renderer renderer;
public int lightmapIndex;
public Vector4 lightmapOffsetScale;
} #if UNITY_EDITOR
[UnityEngine.SerializeField]
Texture2D[] lightmapTexs; //当前场景的灯光贴图
#endif [UnityEngine.SerializeField]
RendererInfo[] rendererList; #if UNITY_EDITOR
public void SaveLightmap()
{
Renderer[] renders = GetComponentsInChildren<Renderer>(true);
RendererInfo rendererInfo;
rendererList = new RendererInfo[renders.Length]; int index = ; for(int r = , rLength = renders.Length; r<rLength; ++r)
{
if (renders[r].gameObject.isStatic == false) continue; rendererInfo.renderer = renders[r];
rendererInfo.lightmapIndex = renders[r].lightmapIndex;
rendererInfo.lightmapOffsetScale = renders[r].lightmapScaleOffset; rendererList[index] = rendererInfo; ++index;
} //序列化光照贴图
LightmapData[] ldata = LightmapSettings.lightmaps;
lightmapTexs = new Texture2D[ldata.Length];
for(int t = , tLength = ldata.Length; t<tLength; ++t)
{
lightmapTexs[t] = ldata[t].lightmapFar;
}
} void Awake()
{
this.LoadLightmap();
}
#endif #if !UNITY_EDITOR
public
#endif
void LoadLightmap()
{
if(null == rendererList || rendererList.Length == )
{
Debug.Log(gameObject.name + " 的 光照信息为空");
return;
} Renderer[] renders = GetComponentsInChildren<Renderer>(true); for(int r = , rLength = renders.Length; r<rLength; ++r)
{
renders[r].lightmapIndex = rendererList[r].lightmapIndex;
renders[r].lightmapScaleOffset = rendererList[r].lightmapOffsetScale;
} #if UNITY_EDITOR
if(null == lightmapTexs || lightmapTexs.Length == )
{
return;
} LightmapSettings.lightmapsMode = LightmapsMode.NonDirectional;
LightmapData[] ldata = new LightmapData[lightmapTexs.Length];
LightmapSettings.lightmaps = null; for(int t = , tLength = lightmapTexs.Length; t<tLength; ++t)
{
ldata[t] = new LightmapData();
ldata[t].lightmapFar = lightmapTexs[t];
} LightmapSettings.lightmaps = ldata;
#endif
}
}

其中

Texture2D[] lightmapTexs;
Awake();
是我为了方便美术测试,发布项目中,我手动管理何时加载光照信息和光照贴图,至此代码已提供完。

下面说点碰到的坑:
1、PC正常,发布到android或ios完全看不到光照信息,并且序列化参数都正确,光照贴图也加载正常,LightmapSettings.lightmapsMode = LightmapsMode.NonDirectional 设置正常:
  在发布时,Edit - Project Settings - Graphics - Shader Stripping - Lightmap modes - Manual
  关于该选项的官方说明:By default, Unity looks at your scenes and lightmapping settings to figure out which Fog and Lightmapping modes are used; and skips corresponding shader variants. This saves game build data size, and improves loading times.
  也就是说,如果你想用脚本动态的控制,那么就得将这里设置为手动模式。
2、最后一个坑就是不能完全相信搜索结果,他人记录的可能只是针对其出现的问题。

Unity 5.x动态加载光照信息(所有坑已踩)的更多相关文章

  1. C# 动态加载程序集信息

    本文通过一个简单的实例,来讲解动态加载Dll需要的知识点.仅供学习分享使用,如有不足之处,还请指正. 在设计模式的策略模式中,需要动态加载程序集信息. 涉及知识点: AssemblyName类,完整描 ...

  2. Unity中资源动态加载的几种方式比较

    http://blog.csdn.net/leonwei/article/details/18406103 初学Unity的过程中,会发现打包发布程序后,unity会自动将场景需要引用到的资源打包到安 ...

  3. Delphi中动态加载TreeView信息

    unit Unit3; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  4. Unity动态加载和内存管理(三合一)

    原址:http://game.ceeger.com/forum/read.php?tid=4394#info 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Re ...

  5. Unity Lightmap动态加载研究

    什么情况下需要Lightmap? 移动平台上目前暂时还不能开实时光影效果,会卡成幻灯片.所以就需要将光影烘焙到贴图上. 什么情况下需要动态加载Lightmap? 1.当项目抛弃了Unity的多场景模式 ...

  6. unity动态加载(翻译) .

    AssetBundles are files which you can export from Unity to contain assets of your choice. These files ...

  7. Unity使用脚本进行批量动态加载贴图

    先描述一下我正在做的这个项目,是跑酷类音游. 那么跑酷类音游在绘制跑道上的时候,就要考虑不同的砖块显示问题.假设我有了一个节奏列表,那么我们怎么将不同的贴图贴到不同的砖块上去呢? 我花了好几个小时才搞 ...

  8. Unity 利用UGUI打包图集,动态加载sprite资源

    今天做了一个UI界面,这个界面是好友界面,该界面上有若干个好友item. 需要对每个tem的头像对象(image)动态显示对应的头像.尝试利用UGUI的图集来加载,具体实现如下: 1.首先,需要知道S ...

  9. Unity学习笔记(5):动态加载Prefab

    第一种方法,从Resources文件夹读取Prefab Assets/Resources文件夹是Unity中的一个特殊文件夹,在博主当前的认知里,放在这个文件夹里的Prefab可以被代码动态加载 直接 ...

随机推荐

  1. [Treap][学习笔记]

    平衡树 平衡树就是一种可以在log的时间复杂度内完成数据的插入,删除,查找第k大,查询排名,查询前驱后继以及其他许多操作的数据结构. Treap treap是一种比较好写,常数比较小,可以实现平衡树基 ...

  2. 关于gcd的四道题

    T1:bzoj2705 题目描述: 给定一个n求\(\sum\limits_{i=1}^ngcd(i,n)\) 因为n太大,所以O(n)的做法肯定不行,然后就去想根号的方法. \[\sum\limit ...

  3. 对称加密之AES加密详解

    最近有人问我AES对称加密是啥,我回答了个大概,发现自己不能清晰的讲出来,特此记录,以供学习 一.对称加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decrypti ...

  4. GWAS基因芯片数据预处理:质量控制(quality control)

    一.数据为什么要做质量控制 比起表观学研究,GWAS研究很少有引起偏差的来源,一般来说,一个人的基因型终其一生几乎不会改变的,因此很少存在同时影响表型又影响基因型的变异.但即便这样,我们在做GWAS时 ...

  5. GWAS: 阿尔兹海默症和代谢指标在大规模全基因组数据的遗传共享研究

    今天要讲的一篇是发表于 Hum Genet 的 "Shared genetic architecture between metabolic traits and Alzheimer's d ...

  6. Inheritance: 'A' is an inaccessible base of 'B'

    'boost::enable_shared_from_this<net::Session>' is an inaccessible base of 'net::Session' BOOST ...

  7. re模块正则表达式

    regular expression / regex / RE 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配.Python 自1.5版本起增加了re 模块,它提供 ...

  8. day19面向对象 , 用户注册和登录

    #!/usr/bin/env python# -*- coding:utf-8 -*- # 1.简述编写类和执行类中方法的流程."""编写:class Person: d ...

  9. (Python3) 运行结果 = 10,40 的困扰我一顿饭时间的 代码

    a=10 b=30 def kzkzkz(a,b):   #定义一个函数 a=a+b return a b= kzkzkz(a,b) print(a,b)

  10. 利用crontab定时提交svn遇到的几个问题

    交待下背景...公司开发组只有技术经理有服务器和数据库权限,还只是开发环境的..因为工作安排和权限限制,测试同学上线的时候,需要本人帮开发组的部分同事review代码并把代码提交到trunk.一开始手 ...