using UnityEngine;
using System.Collections;
///
/// 对SkinnedMeshRenderer的烘焙处理
///
[ExecuteInEditMode]
public class SkinnedLightmap : MonoBehaviour
{
#if UNITY_EDITOR
//当前是否使用MeshRenderer
public bool UseMeshRenderer = false;
//对当前存储的lightmap信息进行清理
public bool ClearSelf = false;
//对当前场景中所有使用本脚本的对象信息全部全部清理
public bool ClearWithScene = false;
//当前是否使用SkinnedMeshRender
private bool _curUseSkinnedMeshRenderer = true;
//记录当前的MeshRenderer组件引用
private MeshRenderer _renderer;
//记录MeshFilter组件引用
private MeshFilter _filter;
#endif
//记录当前SkinnedMeshRenderer的组件引用
private SkinnedMeshRenderer _skinnedRenderer;
//存储到模型脚本上的,lightmap索引
[SerializeField]
public int _lightmapIndex = -1;
//存储到模型脚本上的,lightmap大小偏移
[SerializeField]
public Vector4 _lightmapOffset = Vector4.zero;
// Use this for initialization
void Start ()
{
//首先获取SkinnedMeshRenderer组件
_skinnedRenderer = GetComponent();
if (_skinnedRenderer == null) return;
//在运行状态下
if (Application.isPlaying)
{
//首先删除MeshRenderer
var mr = GetComponent();
if (mr != null)
{
DestroyObject(mr);
}
var mf = GetComponent();
if (mf != null)
{
DestroyObject(mf);
}
//把skinnedRenderer激活,并赋值lightmap信息
_skinnedRenderer.enabled = true;
_skinnedRenderer.lightmapIndex = _lightmapIndex;
_skinnedRenderer.lightmapScaleOffset = _lightmapOffset;
}
#if UNITY_EDITOR
else
{
//在非运行是,默认使用Meshrender
UseMeshRenderer = true;
_curUseSkinnedMeshRenderer = false;
//判断当前GameObject上是否有这些组件
_renderer = GetComponent();
if (_renderer == null)
{
_renderer = gameObject.AddComponent();
_renderer.sharedMaterial = _skinnedRenderer.sharedMaterial;
}
_filter = GetComponent();
if (_filter == null)
{
_filter = gameObject.AddComponent();
_filter.sharedMesh = _skinnedRenderer.sharedMesh;
}
//把存储的信息赋值给Meshrenderer
_renderer.lightmapIndex = _lightmapIndex;
_renderer.lightmapScaleOffset = _lightmapOffset;
//激活Meshrender,设置为SkinnedMeshRenderer非激活处理
_renderer.enabled = true;
_skinnedRenderer.enabled = false;
}
#endif
}
#if UNITY_EDITOR
// Update is called once per frame
void Update ()
{
//只在Editor下进行Update更新,并且判断当前是否正在运行
if (!Application.isPlaying)
{
//如果点击了isBake CheckBox,
if (UseMeshRenderer == _curUseSkinnedMeshRenderer)
{
_curUseSkinnedMeshRenderer = !UseMeshRenderer;
if (_renderer != null)
{
if (UseMeshRenderer)
{
_renderer.enabled = true;
_skinnedRenderer.enabled = false;
}
else
{
_renderer.enabled = false;
_skinnedRenderer.enabled = true;
}
}
}
//清理所有的lightmapIndex
if (ClearSelf)
{
ClearSelf = false;
_lightmapIndex = -1;
_lightmapOffset = Vector4.zero;
_renderer.lightmapIndex = _lightmapIndex;
_renderer.lightmapScaleOffset = _lightmapOffset;
}
//清理当前场景的所有脚本的lightmapindex
if (ClearWithScene)
{
ClearWithScene = false;
var arr = FindObjectsOfType();
for (int i = 0; i < arr.Length; i++)
{
arr[i]._lightmapIndex = -1;
arr[i]._lightmapOffset = Vector4.zero;
arr[i]._renderer.lightmapIndex = arr[i]._lightmapIndex;
arr[i]._renderer.lightmapScaleOffset = arr[i]._lightmapOffset;
}
}
//保存lightmapIndex
if (_lightmapIndex == -1 && _renderer!=null && _renderer.lightmapIndex != -1)
{
_lightmapIndex = _renderer.lightmapIndex;
_lightmapOffset = _renderer.lightmapScaleOffset;
}
}
}
#endif
}