能搜到这的应该是被新的烘焙系统坑了少时间,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. IOC的理解(转载)

    转载自:https://www.zhihu.com/question/23277575/answer/169698662 要了解控制反转( Inversion of Control ), 我觉得有必要 ...

  2. React 16 加载性能优化指南

    关于 React 应用加载的优化,其实网上类似的文章已经有太多太多了,随便一搜就是一堆,已经成为了一个老生常谈的问题. 但随着 React 16 和 Webpack 4.0 的发布,很多过去的优化手段 ...

  3. js数组sort排序方法的算法

    说明一下,ECMAScript没有定义使用哪种排序算法,各个浏览器的实现方式会有不同.火狐中使用的是归并排序,下面是Chrome的sort排序算法的实现. sort方法源码 DEFINE_METHOD ...

  4. 如何在Linux中使用命令行卸载软件

    您可以使用“dpkg”命令来查看您的计算机,按“Ctrl + Alt + T”的所有已安装包的列表,打开一个终端窗口. 在提示符下键入以下命令,然后按Enter键.dpkg -- list 要卸载程序 ...

  5. 《Exception团队》第一次作业:团队亮相

    一.项目基本介绍 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 Exception 作业学习目标 深入了解软件思想,强化编程技术 二.正文 1. ...

  6. I2C(一)框架

    目录 I2C(一)框架 引入 整体框架 数据结构 文件结构 流程简述 参考文档 title: I2C(一)框架 date: 2019/1/28 17:58:42 toc: true --- I2C(一 ...

  7. 编写高质量的Python代码系列(四)之元类及属性

    元类(metaclass)及动态属性(dynamic attribute)都是很强大的Python特性,然后他们也可能导致及其古怪.及其突然的行为.本节讲解这些机制的常见用法,以确保各位程序员写出来的 ...

  8. python3 两层dict字典转置

    python3; 两层字典 dict =(type, dict2) dict2 = (k_value, index) dictss = { 10: {3: 1, 4: 2, 5: 3, 6: 4, 7 ...

  9. 微信小程序button组件样式

    点击微信按键组件才能出授权,所以自定义样式就是必须的了,来自网友的帮助,如下图 <button class='btn1' open-type='contact'> <image cl ...

  10. 动态解析xml,并生成excel,然后发邮件。

    直接贴代码了! DECLARE @CurrentServer NVARCHAR(100)DECLARE @CurrentDatabase NVARCHAR(100)DECLARE @CurrentLo ...