Unity 5.x动态加载光照信息(所有坑已踩)
能搜到这的应该是被新的烘焙系统坑了少时间,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动态加载光照信息(所有坑已踩)的更多相关文章
- C# 动态加载程序集信息
本文通过一个简单的实例,来讲解动态加载Dll需要的知识点.仅供学习分享使用,如有不足之处,还请指正. 在设计模式的策略模式中,需要动态加载程序集信息. 涉及知识点: AssemblyName类,完整描 ...
- Unity中资源动态加载的几种方式比较
http://blog.csdn.net/leonwei/article/details/18406103 初学Unity的过程中,会发现打包发布程序后,unity会自动将场景需要引用到的资源打包到安 ...
- Delphi中动态加载TreeView信息
unit Unit3; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- Unity动态加载和内存管理(三合一)
原址:http://game.ceeger.com/forum/read.php?tid=4394#info 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Re ...
- Unity Lightmap动态加载研究
什么情况下需要Lightmap? 移动平台上目前暂时还不能开实时光影效果,会卡成幻灯片.所以就需要将光影烘焙到贴图上. 什么情况下需要动态加载Lightmap? 1.当项目抛弃了Unity的多场景模式 ...
- unity动态加载(翻译) .
AssetBundles are files which you can export from Unity to contain assets of your choice. These files ...
- Unity使用脚本进行批量动态加载贴图
先描述一下我正在做的这个项目,是跑酷类音游. 那么跑酷类音游在绘制跑道上的时候,就要考虑不同的砖块显示问题.假设我有了一个节奏列表,那么我们怎么将不同的贴图贴到不同的砖块上去呢? 我花了好几个小时才搞 ...
- Unity 利用UGUI打包图集,动态加载sprite资源
今天做了一个UI界面,这个界面是好友界面,该界面上有若干个好友item. 需要对每个tem的头像对象(image)动态显示对应的头像.尝试利用UGUI的图集来加载,具体实现如下: 1.首先,需要知道S ...
- Unity学习笔记(5):动态加载Prefab
第一种方法,从Resources文件夹读取Prefab Assets/Resources文件夹是Unity中的一个特殊文件夹,在博主当前的认知里,放在这个文件夹里的Prefab可以被代码动态加载 直接 ...
随机推荐
- vscode笔记(一)- vscode自动生成文件头部注释和函数注释
VsCode 自动生成文件头部注释和函数注释 作者:狐狸家的鱼 本文链接:vscode自动生成文件头部注释和函数注释 GitHub:sueRimn 1.安装插件KoroFileHeader 2.设置 ...
- 树莓派中QT实现I2C
树莓派中QT实现I2C 在QT中实现 I2C 使用的驱动为 wiringPi 库的引入 LIBS += -lwiringPi LIBS += -lwiringPiDev 代码实现 widget.h 中 ...
- CF1152E Neko and Flashback--欧拉路径
RemoteJudge 第一次见到欧拉路径的题 注意到\(b\)和\(c\)的构造方法很特殊,即对于一个位置(经过\(p\)作用后)\(i\),若两个数分别为\(b_i\)和\(c_i\),那么在\( ...
- CSS上下左右居中的几种方法
1.absolute,margin: auto .container { position: relative; } .content { position: absolute; margin: au ...
- Zabbix 监控触发器设置
简述 在生产环境中,有一台mysql的备份服务器,上面运行着三个数据库实例的从库,也在做日志的同步工作,为了实现对该备份服务器的监控,当出现从库实例不为3或者日志同步进程不为3的时候,产生告警通知,生 ...
- (转) qt: usb热插拔(linux);
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> ...
- Springboot自定义异常处理
1.自定义异常类 import lombok.Data; @Data public class UserException extends RuntimeException { private Lon ...
- Linux忘记root密码 单用户模式 及启动加密
单用户模式: 在系统启动引导读秒时,按任意键进入系统选项 再按 e 键 选择第二项 按 e 进入编辑 输入 空格 1 然后回车 再按B 键 不需要密码即可进入系统 再passwd ...
- AIC与BIC
首先看几个问题 1.实现参数的稀疏有什么好处? 一个好处是可以简化模型.避免过拟合.因为一个模型中真正重要的参数可能并不多,如果考虑所有的参数作用,会引发过拟合.并且参数少了模型的解释能力会变强. 2 ...
- c语言编译四大步
-o: 指定生成后的文件名,后面跟指定的名称 四步:-E 预处理 > -S 编译 > -c 汇编 > 链接 -E: 表示预处理,生成文件为.i,会做宏(define)定义的展开.头文 ...