Unity 场景存在多个烘焙光照效果
2017-04-14 10:57
411 查看
using UnityEngine; using System.Collections.Generic; using System; [Serializable] public class ObjLightMapData { public string path; public Vector4 scaleOffset; } [Serializable] public class SceneLightMapData : MonoBehaviour { public GameObject targetObj; public Texture2D lightMap; //[SerializeField] public List<ObjLightMapData> objDataList = new List<ObjLightMapData>(); private const string CUSTOM_LIGHTMAP_PATH = "xxxx/LightMapDiffuse"; public void Clear() { if (objDataList.Count > 0) { objDataList.Clear(); } } string GetPath(Transform tran, string rootName) { if (tran.name != rootName) { string context = ""; context += tran.name; Transform par = tran.parent; while (par != null && par.name != rootName) { context = string.Format("{0}/{1}", par.name, context); par = par.parent; } return context; } return ""; } public bool Save() { Clear(); if (targetObj != null) { string rootName = targetObj.name; Renderer[] rs = targetObj.GetComponentsInChildren<Renderer>(); foreach (Renderer r in rs) { Transform t = r.transform; if (r != null && r.name != rootName) { ObjLightMapData data = new ObjLightMapData(); string path = GetPath(t, rootName); Vector4 scaleOffset = r.lightmapScaleOffset; data.path = path; data.scaleOffset = scaleOffset; objDataList.Add(data); } } return true; } return false; } public void Load(GameObject rootObj) { if (rootObj != null) { Vector4 notNormalVec4 = new Vector4(1, 1, 0, 0); for (int i = 0; i < objDataList.Count; i++) { ObjLightMapData data = objDataList[i]; string path = data.path; Vector4 scaleOffset = data.scaleOffset; Renderer r; Transform obj = rootObj.transform.Find(path); if (obj != null) { r = obj.GetComponent<Renderer>(); if (r == null || scaleOffset == notNormalVec4){ continue; } //r.realtimeLightmapScaleOffset = scaleOffset; // 换lightmap材质 Material mat = r.material; mat.shader = Shader.Find(CUSTOM_LIGHTMAP_PATH); mat.SetTexture("_LightMap", lightMap); mat.SetTextureScale("_LightMap", new Vector2(scaleOffset.x, scaleOffset.y)); mat.SetTextureOffset("_LightMap", new Vector2(scaleOffset.z, scaleOffset.w)); mat.SetColor("_Color", Color.white); } } } } }
using UnityEngine;
using System.Collections;
using UnityEditor;
[CustomEditor(typeof(SceneLightMapData))]
public class SceneLightMapDataEditor : Editor
{
private SerializedProperty _targetObj;
private SerializedProperty _lightmap;
//private SerializedProperty _data;
public void OnEnable()
{
_targetObj = serializedObject.FindProperty("targetObj");
_lightmap = serializedObject.FindProperty("lightMap");
//_data = serializedObject.FindProperty("_objDataList");
}
public override void OnInspectorGUI()
{
EditorGUILayout.PropertyField(_targetObj);
EditorGUILayout.PropertyField(_lightmap);
//EditorGUILayout.PropertyField(_data);
SceneLightMapData self = (SceneLightMapData)target;
foreach (ObjLightMapData data in self.objDataList)
{
EditorGUILayout.Vector4Field(data.path, data.scaleOffset);
}
if (GUILayout.Button("Save"))
{
if (self.Save())
{
EditorUtility.DisplayDialog("通知", "成功", "OK");
}
else
{
EditorUtility.DisplayDialog("通知", "失败", "OK");
}
}
serializedObject.ApplyModifiedProperties();
}
}
using UnityEngine;
using System.Collections;
public class ConfigSceneLightmap : MonoBehaviour {
public Object dataPrefab;
// Use this for initialization
void Start () {
if (dataPrefab) {
GameObject data = GameObject.Instantiate (dataPrefab) as GameObject;
SceneLightMapData com = data.GetComponent<SceneLightMapData> ();
Debug.Assert (com != null, "Prefab缺少SceneLightMapData组件");
com.Load (gameObject);
}
}
// Update is called once per frame
void Update () {
}
}
相关文章推荐
- Unity 烘焙贴图后再拖成预设体后场景光照信息丢失
- unity 2017.3 Tips 重置场景后变暗(丢失烘焙效果)
- Unity实现场景加载渐入渐出效果
- Unity烘焙动态光照实现光源优化
- Unity光照烘焙后,在PC上曝光,发布移动平台正常的解决方法
- [Unity 3D教程]教你如何在3D场景中选择物体并显示轮廓效果
- Unity 5光照贴图烘焙课程分享
- Unity微端场景加载(三)动态加载光照贴图
- unity 24小时日出日落光照效果参考
- Unity2D实现贴图凹凸感并接受实时光照效果
- Unity场景切换过度效果(Shader)
- Unity在一个场景中使用其他场景烘焙的物体
- Unity5.x 烘焙场景导出方法(更换lightmap曝光丢失问题)
- unity5.3 场景烘焙
- Unity中在场景中添加水资源效果的方法
- (4)unity入门,模型、光照、角色移动、场景加载
- Unity烘焙动态光照实现光源优化
- 【个人Unity笔记】烘焙光照贴图后保留法线和光探头
- unity场景烘焙贴图丢失问题
- Unity切换场景淡入淡出效果