Unity 解决 动态设置Lightmap 贴图会歪的问题
2014-10-22 15:35
232 查看
在unity烘培好lightmap后lightmap信息会被保存在unity中, 而不在fbx中,这就意味着你把模型拿出去修改下再回来lightmap就没了, 更常见的情况是美工把fbx和lightmap给你,你完全无法使用. 因为unity没有提供给模型设置lightmap信息的方法.
百度了下发现这个文章:http://blog.sina.com.cn/s/blog_5b6cb9500101cplo.html (感谢作者)里面提供了设置lightmap信息的方法,但是有bug,里面TestLightmapingInfo()方法中直接把lightmapTilingOffset(Vector4) tostring了,这样界面上输出的值就会自动保留一位小数,就导致了严重的误差.....这坑了我好久
- -, 下面我写了个正常的版本,还包括直接在编辑模型下设置lightmap信息 :
/// <summary>
/// 输出和设置Lightmap信息
/// </summary>
public class PrintLightmapMessage : EditorWindow
{
[MenuItem("Batch/" + "测试Lightmapping信息 ")]
static void TestLightmapingInfo()
{
GameObject[] tempObject;
if (Selection.activeGameObject)
{
tempObject = Selection.gameObjects;
for (int i = 0; i < tempObject.Length; i++)
{
Debug.Log("Object name: " + tempObject[i].name);
Debug.Log("Lightmaping Index: " + tempObject[i].renderer.lightmapIndex);
Debug.Log("Lightmaping Offset.x: " + tempObject[i].renderer.lightmapTilingOffset.x);
Debug.Log("Lightmaping Offset.y: " + tempObject[i].renderer.lightmapTilingOffset.y);
Debug.Log("Lightmaping Offset.z: " + tempObject[i].renderer.lightmapTilingOffset.z);
Debug.Log("Lightmaping Offset.w: " + tempObject[i].renderer.lightmapTilingOffset.w);
}
}
}
[MenuItem("Batch/" + "设置Lightmapping信息")]
static void SetLightmapingInfo()
{
GameObject[] tempObject;
if (Selection.activeGameObject)
{
tempObject = Selection.gameObjects;
for (int i = 0; i < tempObject.Length; i++)
{
LightmapAssignment la = tempObject[i].GetComponent<LightmapAssignment>();
if (la != null)
{
Debug.Log("set Object name: " + tempObject[i].name);
Debug.Log("Lightmaping Index: " + la.lightmapIndex);
Debug.Log("Lightmaping Offset.x: " + tempObject[i].renderer.lightmapTilingOffset.x);
Debug.Log("Lightmaping Offset.y: " + tempObject[i].renderer.lightmapTilingOffset.y);
Debug.Log("Lightmaping Offset.z: " + tempObject[i].renderer.lightmapTilingOffset.z);
Debug.Log("Lightmaping Offset.w: " + tempObject[i].renderer.lightmapTilingOffset.w);
la.gameObject.renderer.lightmapIndex = la.lightmapIndex;
la.gameObject.renderer.lightmapTilingOffset = la.lightmapTilingOffset;
}
else
{
Debug.Log("在物体 '" + tempObject[i].name + "' 上没有找到 LightmapAssignment 脚本, 无法设置....");
}
}
}
}
}
百度了下发现这个文章:http://blog.sina.com.cn/s/blog_5b6cb9500101cplo.html (感谢作者)里面提供了设置lightmap信息的方法,但是有bug,里面TestLightmapingInfo()方法中直接把lightmapTilingOffset(Vector4) tostring了,这样界面上输出的值就会自动保留一位小数,就导致了严重的误差.....这坑了我好久
- -, 下面我写了个正常的版本,还包括直接在编辑模型下设置lightmap信息 :
/// <summary>
/// 输出和设置Lightmap信息
/// </summary>
public class PrintLightmapMessage : EditorWindow
{
[MenuItem("Batch/" + "测试Lightmapping信息 ")]
static void TestLightmapingInfo()
{
GameObject[] tempObject;
if (Selection.activeGameObject)
{
tempObject = Selection.gameObjects;
for (int i = 0; i < tempObject.Length; i++)
{
Debug.Log("Object name: " + tempObject[i].name);
Debug.Log("Lightmaping Index: " + tempObject[i].renderer.lightmapIndex);
Debug.Log("Lightmaping Offset.x: " + tempObject[i].renderer.lightmapTilingOffset.x);
Debug.Log("Lightmaping Offset.y: " + tempObject[i].renderer.lightmapTilingOffset.y);
Debug.Log("Lightmaping Offset.z: " + tempObject[i].renderer.lightmapTilingOffset.z);
Debug.Log("Lightmaping Offset.w: " + tempObject[i].renderer.lightmapTilingOffset.w);
}
}
}
[MenuItem("Batch/" + "设置Lightmapping信息")]
static void SetLightmapingInfo()
{
GameObject[] tempObject;
if (Selection.activeGameObject)
{
tempObject = Selection.gameObjects;
for (int i = 0; i < tempObject.Length; i++)
{
LightmapAssignment la = tempObject[i].GetComponent<LightmapAssignment>();
if (la != null)
{
Debug.Log("set Object name: " + tempObject[i].name);
Debug.Log("Lightmaping Index: " + la.lightmapIndex);
Debug.Log("Lightmaping Offset.x: " + tempObject[i].renderer.lightmapTilingOffset.x);
Debug.Log("Lightmaping Offset.y: " + tempObject[i].renderer.lightmapTilingOffset.y);
Debug.Log("Lightmaping Offset.z: " + tempObject[i].renderer.lightmapTilingOffset.z);
Debug.Log("Lightmaping Offset.w: " + tempObject[i].renderer.lightmapTilingOffset.w);
la.gameObject.renderer.lightmapIndex = la.lightmapIndex;
la.gameObject.renderer.lightmapTilingOffset = la.lightmapTilingOffset;
}
else
{
Debug.Log("在物体 '" + tempObject[i].name + "' 上没有找到 LightmapAssignment 脚本, 无法设置....");
}
}
}
}
}
相关文章推荐
- Extjs form表单 动态设置标签的隐藏和显示 (解决问题)
- 通过窗口大小适时调整以及子窗口的动态布局来解决窗口在不同DPI设置下的显示问题
- unity标准材质球动态改值和共用材质不同设置问题
- Android笔记 四种方案解决ScrollView嵌套ListView问题之动态设置ListView高度代码整理
- Unity5 项目设置 .gitignore 解决 Missing Prefab 问题
- 动态规划解决航线设置问题
- 安卓学习之使用listview设置adapter时,解决动态显示图片的问题
- 京城游戏人-Day16: 解决 Unity 2D 游戏中贴图模糊的问题
- 【Android基础学习】动态设置 listView的高度,解决scrollView中嵌套listview时显示不全的问题
- .NET下fckeditor动态设置文件上传路径,解决多用户多路径的问题。
- 动态生成的IFRAME,设置SRC时的问题解决分析
- 解决Android开发中ViewPager动态设置PagerAdapter时第二次进入Fragment内容不显示的问题
- Unity动态字体在手机上出现字体丢失问题解决
- 【VR视频播放】解决Unity模型贴图反转的问题
- Extjs form表单 动态设置标签的隐藏和显示 (解决问题)
- Android程序中代码动态设置Textview文字的大小解决px转dp的问题
- 通过动态设置ListView高度来解决ScollView与ListView互相嵌套的问题
- Unity Shader:三向贴图(Tri-planar mapping)---解决地形拉伸贴图变形以及贴图边缘的缝隙问题
- 动态生成的IFRAME,设置SRC时的问题解决分析
- jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法