能搜到这的应该是被新的烘焙系统坑了少时间,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. 第二篇--PCI设备解析

    介绍:参考 一个系统上最多有256个PCI总线,每个总线最多有32个设备,每个设备最多有8个功能,每个功能最多有256字节的配置地址空间,所以总的配置地址空间是16M. PCI设备有物理设备和逻辑设备 ...

  2. MFC:位图和图标的设置

    一. 图标的设置 加载图标   API函数:AfxGetApp()->LoadIconW(); 2. 显示图标 API函数:SetClassLong(); 函数原型:DWORD WINAPI S ...

  3. idea代码出现Usage of API documented as @since 1.8+ less... (Ctrl+F1)

    问题: Usage of API documented as @since 1.8+ less... (Ctrl+F1) This inspection finds all usages of met ...

  4. 二、docker的安装和基本命令

    一.docker的安装 1.安装依赖 # yum install -y yum-utils device-mapper-persistent-data 2.设置yum源 # yum-config-ma ...

  5. Django web编程2 -- 编辑页面内容

    你将创建一些表单,让用户能够添加主题和条目,以及编辑既有的条目.你还将学习Django如何防范对基于表单的网页发起的常见攻击,这让你无需花太多时间考虑确保应用程序安全的问题. 然后,我们将实现一个用户 ...

  6. Python正则表达式指南(转)

    目录 Python正则表达式指南(转) 0.防走丢 1. 正则表达式基础 1.1. 简单介绍 1.2. 数量词的贪婪模式与非贪婪模式 1.3. 反斜杠的困扰 1.4. 匹配模式 2. re模块 2.1 ...

  7. ArcGis dbf读写——挂接Excel到属性表 C#

    ArcMap提供了挂接Excel表格信息到属性表的功能,但是当数据量较大到以万计甚至十万计的时候这个功能就歇菜了,当然,你可以考虑分段挂接.这个挂接功能只是做了一个表关联,属性记录每个字段的信息需要通 ...

  8. Thrax-构建基于语法的语言模型工具

    安装 http://www.openfst.org/twiki/bin/view/GRM/ThraxQuickTour http://cslu.ogi.edu/~sproatr/Courses/Tex ...

  9. Lambda表达式与函数式接口

    Lambda表达式的类型,也被称为目标类型(targer type),Lambda表达式的目标类型必须是"函数式接口(functional interface)".函数式接口代表只 ...

  10. Groovy中的GString

    在讨论GString之前,我们先讨论一下Groovy里面的String.在Groovy里面String有 println 'test string' println '''test string''' ...