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 }