157 lines
5.1 KiB
C#
157 lines
5.1 KiB
C#
using UnityEngine;
|
|
using System.Collections;
|
|
|
|
/// <summary>
|
|
/// 对SkinnedMeshRenderer的烘焙处理
|
|
/// </summary>
|
|
[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<SkinnedMeshRenderer>();
|
|
if (_skinnedRenderer == null) return;
|
|
|
|
//在运行状态下
|
|
if (Application.isPlaying)
|
|
{
|
|
//首先删除MeshRenderer
|
|
var mr = GetComponent<MeshRenderer>();
|
|
if (mr != null)
|
|
{
|
|
DestroyObject(mr);
|
|
}
|
|
var mf = GetComponent<MeshFilter>();
|
|
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<MeshRenderer>();
|
|
if (_renderer == null)
|
|
{
|
|
_renderer = gameObject.AddComponent<MeshRenderer>();
|
|
_renderer.sharedMaterial = _skinnedRenderer.sharedMaterial;
|
|
}
|
|
|
|
_filter = GetComponent<MeshFilter>();
|
|
if (_filter == null)
|
|
{
|
|
_filter = gameObject.AddComponent<MeshFilter>();
|
|
_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<SkinnedLightmap>();
|
|
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
|
|
}
|