using UnityEngine;
|
using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine.Rendering;
|
|
public class PrefabLightmapData : MonoBehaviour
|
{
|
[System.Serializable]
|
public struct RendererInfo
|
{
|
public Renderer renderer;
|
public int lightmapIndex;
|
public Vector4 lightmapOffsetScale;
|
}
|
|
[System.Serializable]
|
public struct LightmapInfo
|
{
|
public Texture2D lightmapFar;
|
public Texture2D lightmapNear;
|
}
|
|
public List<RendererInfo> m_RendererInfo = new List<RendererInfo>();
|
|
public List<LightmapInfo> lightmapInfo = new List<LightmapInfo>();
|
|
void Awake()
|
{
|
ResetT4mShader();
|
LoadLightmap();
|
}
|
|
private void ResetT4mShader()
|
{
|
Renderer[] tmpRenderers = gameObject.GetComponentsInChildren<MeshRenderer>();
|
if (tmpRenderers == null) {
|
return;
|
}
|
|
for (int i = 0, length = tmpRenderers.Length; i < length; i++) {
|
//重新设置T4M
|
Material[] tmpMaterialArray = tmpRenderers[i].materials;
|
for (int j = 0, matlength = tmpMaterialArray.Length; j < matlength; j++) {
|
if (tmpMaterialArray[j].shader.name.Contains("T4M 4 Textures")) {
|
Shader tmpShader = Shader.Find("T4MShaders/ShaderModel2/Diffuse/T4M 4 Textures");
|
if (tmpShader == null) {
|
DebugEx.Log("tmpShader is Null");
|
continue;
|
}
|
tmpMaterialArray[j].shader = tmpShader;
|
}
|
}
|
}
|
}
|
|
public void SaveLightmap()
|
{
|
m_RendererInfo.Clear();
|
|
var renderers = GetComponentsInChildren<MeshRenderer>();
|
foreach (MeshRenderer r in renderers) {
|
if (r.lightmapIndex != -1) {
|
RendererInfo info = new RendererInfo();
|
info.renderer = r;
|
info.lightmapOffsetScale = r.lightmapScaleOffset;
|
info.lightmapIndex = r.lightmapIndex;
|
m_RendererInfo.Add(info);
|
}
|
}
|
|
lightmapInfo.Clear();
|
LightmapData[] mapDatas = LightmapSettings.lightmaps;
|
for (int i = 0; i < mapDatas.Length; i++) {
|
LightmapInfo info = new LightmapInfo();
|
info.lightmapFar = mapDatas[i].lightmapColor;
|
info.lightmapNear = mapDatas[i].lightmapDir;
|
lightmapInfo.Add(info);
|
}
|
}
|
|
public void LoadLightmap()
|
{
|
if (m_RendererInfo.Count <= 0) return;
|
|
foreach (var item in m_RendererInfo) {
|
item.renderer.lightmapIndex = item.lightmapIndex;
|
item.renderer.lightmapScaleOffset = item.lightmapOffsetScale;
|
}
|
|
LightmapSettings.lightmaps = null;
|
if (lightmapInfo.Count == 0)
|
return;
|
|
LightmapData[] datas = new LightmapData[lightmapInfo.Count];
|
for (int i = 0; i < lightmapInfo.Count; i++) {
|
datas[i] = new LightmapData();
|
datas[i].lightmapColor = lightmapInfo[i].lightmapFar;
|
datas[i].lightmapDir = lightmapInfo[i].lightmapNear;
|
}
|
LightmapSettings.lightmaps = datas;
|
}
|
}
|