您的位置:首页 > 移动开发 > Unity3D

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