unity如果unity3d场景模型下载中没有光照,是否不能使用光照模型

Unity中光照贴图一二坑及解决办法 - 推酷
Unity中光照贴图一二坑及解决办法
Lightmap(光照贴图)是Unity里很常用的一个功能,毕竟移动设备上实时光照不靠谱,要出效果还是得烘焙。但是在使用中发现了几坑的地方,通过自己写了个两个脚本就轻松搞定,这里分享下。
坑1: 异步加载场景
这个其实还是挺常见的坑:在编辑器里烘焙+播放场景都没问题,但是当从别的场景利用 异步加载 方式切换之后,就发现场景里的效果一团糟。下图是我使用 Application.LoadLevelAdditiveAsync 切换后的效果:
如果是同步的加载场景倒是没有这个问题,但是实际游戏一般也不会让玩家卡住等待一段时间。这个问题在官方论坛和issue tracker上都有人提及,产生的原因是切换场景之后无法自动切换该场景使用的lightmap数据,具体可以参考 UnityEngine.LightmapSettings 相关API。
解决办法也很简单,我实现了一个小脚本,挂在场景中;当场景载入完成,这个物体会在 Start() 中自动刷新当前的光照贴图设置。为了美术方便,脚本能够在每次场景烘焙完之后自动保存新的光照贴图设置,这样就避免了手动操作。
using UnityEngine;
[ExecuteInEditMode]
public class SerializedLightmapSetting : MonoBehaviour
[HideInInspector]
public Texture2D []lightmapFar, lightmapNear;
[HideInInspector]
public LightmapsMode mode;
#if UNITY_EDITOR
public void OnEnable()
//Debug.Log(&[SerializedLightmapSetting] hook&);
UnityEditor.Lightmapping.completed += LoadLightmaps;
public void OnDisable()
//Debug.Log(&[SerializedLightmapSetting] unhook&);
UnityEditor.Lightmapping.completed -= LoadLightmaps;
public void Start ()
if(Application.isPlaying)
LightmapSettings.lightmapsMode = mode;
int l1 = (lightmapFar == null) ? 0 : lightmapFar.Length;
int l2 = (lightmapNear == null) ? 0 : lightmapNear.Length;
int l = (l1 & l2) ? l2 : l1;
LightmapData[] lightmaps = null;
if (l & 0)
lightmaps = new LightmapData[l];
for (int i = 0; i & l; i++)
lightmaps[i] = new LightmapData();
if (i & l1)
lightmaps[i].lightmapFar = lightmapFar[i];
if (i & l2)
lightmaps[i].lightmapNear = lightmapNear[i];
LightmapSettings.lightmaps = lightmaps;
Destroy(this);
#if UNITY_EDITOR
public void LoadLightmaps()
mode = LightmapSettings.lightmapsMode;
lightmapFar = null;
lightmapNear = null;
if (LightmapSettings.lightmaps != null && LightmapSettings.lightmaps.Length & 0)
int l = LightmapSettings.lightmaps.Length;
lightmapFar = new Texture2D[l];
lightmapNear = new Texture2D[l];
for (int i = 0; i & l; i++)
lightmapFar[i] = LightmapSettings.lightmaps[i].lightmapFar;
lightmapNear[i] = LightmapSettings.lightmaps[i].lightmapNear;
MeshLightmapSetting[] savers = GameObject.FindObjectsOfType&MeshLightmapSetting&();
foreach(MeshLightmapSetting s in savers)
s.SaveSettings();
ps. 这里额外提一个坑的地方:一开始我想避免使用 MonoBehavior 这种比较笨重的东西来保存数据,然后参考了Unity官方博客里的 ScriptableObject 。结果尝试了一下午发现博客中的代码压根不起作用,感觉就是从头就写错了...
ps2. 编辑器提供的API还是挺方便的~最早版本的脚本每次烘焙完之后需要美术手动保存光照贴图设置,总是会忘,现在改成自动的就好多了。
坑2: Prefab化物体
在前面代码中有几行涉及到了 MeshLightmapSetting ,这个其实就是设计了第二个问题:利用 Instantiate 实例化的prefab的光照贴图也是一团糟,只有始终在场景里的物体才是正常的。
这个问题的本质原因是,prefab物体的光照贴图信息其实是保存在场景文件里,而不是对应的prefab中;这样以后当场景中有一个prefab的多个实例时,引擎能找到对应的光照贴图位置。但是实际项目中,为了提高场景的加载速度,我们的物体基本全是在代码里加载的,避免了加载场景时就同时加载了一堆prefab,所以就导致光照贴图全跪。
找到原因之后,就比较好解决了——既然引擎不保存,我可以手动保存一份就行了:
using UnityEngine;
[ExecuteInEditMode]
[RequireComponent(typeof(Renderer))]
public class MeshLightmapSetting : MonoBehaviour {
[HideInInspector]
public int lightmapIndex;
[HideInInspector]
public Vector4 lightmapScaleOffset;
public void SaveSettings()
Renderer renderer = GetComponent&Renderer&();
lightmapIndex = renderer.lightmapIndex;
lightmapScaleOffset = renderer.lightmapScaleOffset;
public void LoadSettings()
Renderer renderer = GetComponent&Renderer&();
renderer.lightmapIndex = lightmapIndex;
renderer.lightmapScaleOffset = lightmapScaleOffset;
void Start () {
LoadSettings();
if(Application.isPlaying)
Destroy(this);
其实从这两点出发,可以更加灵活的使用光照贴图:
美术在不同光照条件下烘焙的lightmap保存起来,然后在运行时利用第一个脚本的思路切换,就实现了天气系统;
通过设置模型renderer的属性,可以使得不同物体复用(当然你得真正理解清楚光照贴图);
之后有机会的话,我会再整理下利用prefab加速场景加载的话题,目前单个场景从未优化的14s左右降到4s左右~
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
unity3d教你如何搭建场景
下载积分:1000
内容提示:unity3d教你如何搭建场景
文档格式:DOC|
浏览次数:334|
上传日期: 08:05:42|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1000 积分
下载此文档
该用户还上传了这些文档
unity3d教你如何搭建场景
官方公共微信当前位置: >
unity 场景画面流畅需要做的几件事
时间: 10:36 来源:互联网 作者:网络 浏览:
unity 场景画面流畅需要做的几件事主要有五个方面
第一 优化模型,减少模型面数。
第二 优化图形图片,调整合适图片尺寸。
第三 unity中烘焙场景,优化灯光。
第四 使用lod功能,优化距离内模型及贴图。
第五 多个场景或区域时采用脚本分区域异步加载。
(责任编辑:雷霆风)
免责声明:Unity之家部分内容来源于互联网,如有侵权,请联系我们,本站将立即进行处理。
猜你也喜欢看这些 ??????
其他类型的Unity美化 ??????unity3d 光照贴图_文档下载
&当前位置:
> unity3d 光照贴图
unity3d 光照贴图
unity 灯光-烘焙光照贴图_计算机软件及应用_IT/计算机_专业资料。一篇关于unity...Unity3D之Lightmap入门、... 6页 2下载券
vray灯光贴图烘焙步骤 8页 免费 ...Unity3D 之 Lightmap 入门作者:李志健 Unity 内置的光照贴图烘培工具是 Illuminate Labs 的 Beast。烘培光照贴图流程被完美的整合到 Unity 中。这就 意味着使用 ...unity烘焙光照贴图_学习总结_总结/汇报_实用文档。引言: 光影烘焙,英文叫 ...Unity3D之Lightmap入门、... 6页 2下载券
Maya 中制作和烘培AO贴图... 13...unity3D学习之光照贴图_计算机软件及应用_IT/计算机_专业资料。关于unity3D学习的一些资料 光照贴图完全集成到 Unity 中, 可在编辑器 (Editor) 中创建整个关卡, ...手把手教你如何美化你的Unity3D贴图_计算机软件及应用_IT/计算机_专业资料。手把手...在 unity 中,我们有两个地方可以调整 AO,一个是在光照贴图渲染器中,有一个...游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)_计算机软件及应用_IT/计算机...此渲染路径不支持大部分的逐像素渲染效果:如,阴影、法线 贴图、灯光遮罩、高... 达内教育―中国 IT 培训领导品牌 成都达内:Unity3D-美工渲染...制作环境的 光照贴图的流程要比直接在场景中打灯光要繁琐的多,但是运行速度明显...Unity3D 技术之 Advanced 优化图形性能详解优化图形性能良好的性能对大部分游戏的...生成光照贴图环境的过程仅比在 Unity 将光照直接放置在场景稍 微长一点点,但是...Unity3D_Lightmap教程_IT/计算机_专业资料。介绍unity3d中自带Lightmap的使用方法...C 这将告诉 Unity, 这些物体将不会被移动和改变并且可以被赋予光照贴图。 10...Unity3D技术之Graphics Features线性照明(仅限专业版)浅析_纺织/轻工业_工程科技...在线 性照明和伽玛照明之间切换或返回时,需要重新烘焙光照贴图。Unity 光照贴图...
最近文档搜索:
更多文档:
本站所有资源均来自互联网,本站只负责收集和整理,均不承担任何法律责任,如有侵权等其它行为请联系我们.
文档下载 Copyright
All Rights Reserved.&& 

我要回帖

更多关于 unity场景模型 的文章

 

随机推荐