using System; using System.Collections.Generic; using UnityEngine; namespace Thousandto.Launcher.ExternalLibs { /// /// 渲染的资源信息 /// [Serializable] public class RenderAssetData { //路径 public string Path; //渲染的类型 public RendererType RenderType; //关联Mesh数组 public Mesh[] MeshArray; //材质索引 public MaterialAssetData[] MatArray; //这个时针对粒子效果的,如果有拖尾材质,需要这个设定一个值 public int TrailMaterialIndex = -1; //处理特效Renderer中拖尾材质 public MaterialAssetData TrailMaterialAsset = null; #region //运行时执行 //卸载 public void Unload() { if (MeshArray != null) { for (int i = 0; i < MeshArray.Length; i++) { if (MeshArray[i] != null) { Resources.UnloadAsset(MeshArray[i]); } } MeshArray = null; } if (MatArray != null) { for (int i = 0; i < MatArray.Length; i++) { if (MatArray[i] != null) { MatArray[i].Unload(); } } MatArray = null; } } //设置Renderer public void ToRenderer(Transform trans) { Material[] mats = null; if (MatArray != null) { mats = new Material[MatArray.Length]; for (int i = 0; i < MatArray.Length; i++) { if (MatArray[i] != null) { mats[i] = MatArray[i].ToMaterialAsset(); } } } Material trailMat = null; if (TrailMaterialAsset != null && !string.IsNullOrEmpty(TrailMaterialAsset.ShaderName)) { trailMat = TrailMaterialAsset.ToMaterialAsset(); } else if(TrailMaterialIndex >= 0 && TrailMaterialIndex < mats.Length) { trailMat = mats[TrailMaterialIndex]; } switch (RenderType) { case RendererType.MeshRenderer: //静态Mesh var mf = trans.GetComponent(); if (mf != null) mf.sharedMesh = (MeshArray != null && MeshArray.Length > 0) ? MeshArray[0] : null; var mr = trans.GetComponent(); if (mr != null) mr.sharedMaterials = mats; break; case RendererType.SkinnedMeshRenderer://骨骼皮肤Mesh var smr = trans.GetComponent(); if (smr != null) { smr.sharedMesh = (MeshArray != null && MeshArray.Length > 0) ? MeshArray[0] : null; smr.sharedMaterials = mats; } break; case RendererType.ParticleSystemRenderer://粒子Mesh var psr = trans.GetComponent(); if (psr != null) { psr.sharedMaterials = mats; if (trailMat != null) { psr.trailMaterial = trailMat; } psr.SetMeshes(MeshArray); } break; case RendererType.TrailRenderer: var tr = trans.GetComponent(); if (tr != null) { tr.sharedMaterials = mats; } break; } } #endregion #region//编辑器时执行--打包之前数据准备用 #if UNITY_EDITOR [NonSerialized] public Transform TheTransform; //从Renderer获取信息 public bool FromRenderer(Renderer rd, bool removeFromRender,bool isUseTexName, string texDir) { Material[] mats = null; Material trailMat = null; if (rd is SkinnedMeshRenderer) {//带有骨骼的Renderer RenderType = RendererType.SkinnedMeshRenderer; var skinnedRender = rd as SkinnedMeshRenderer; mats = skinnedRender.sharedMaterials; MeshArray = new Mesh[] { skinnedRender.sharedMesh }; if (removeFromRender) { skinnedRender.sharedMaterials = new Material[0]; skinnedRender.sharedMesh = null; } } else if (rd is MeshRenderer) {//静态Mesh的Renderer var render = rd as MeshRenderer; RenderType = RendererType.MeshRenderer; mats = render.sharedMaterials; var mf = rd.gameObject.GetComponent(); if (mf != null) { MeshArray = new Mesh[] { mf.sharedMesh }; } if (removeFromRender) { render.sharedMaterials = new Material[0]; if (mf != null) { mf.sharedMesh = null; } } } else if (rd is ParticleSystemRenderer) {//粒子系统的Renderer var psr = rd as ParticleSystemRenderer; RenderType = RendererType.ParticleSystemRenderer; mats = psr.sharedMaterials; trailMat = psr.trailMaterial; MeshArray = new Mesh[psr.meshCount]; int ret = psr.GetMeshes(MeshArray); Debug.Log("MeshCount:" + psr.meshCount + " " + ret + " " + psr.mesh); if (removeFromRender) { psr.sharedMaterials = new Material[0]; psr.trailMaterial = null; psr.SetMeshes(new Mesh[0]); } TrailMaterialIndex = -1; if (trailMat != null) { for (int i = 0; i < mats.Length; i++) { if (mats[i] == trailMat) { TrailMaterialIndex = i; break; } } if (TrailMaterialIndex >= 0) {//说明拖尾材质,在材质数组中.那么就不需要单独存储拖尾材质 ,只需要记录索引就可以了 trailMat = null; } } } else if (rd is TrailRenderer) { var tr = rd as TrailRenderer; RenderType = RendererType.TrailRenderer; mats = tr.sharedMaterials; if (removeFromRender) { tr.sharedMaterials = new Material[0]; tr.sharedMaterial = null; } } else {//未知 RenderType = RendererType.None; Debug.Log("Find Unknow Render:" + rd.GetType().FullName); } //材质列表是否为空 if (mats != null) { List list = new List(); for (int i = 0; i < mats.Length; i++) { if (mats[i] != null) { MaterialAssetData mi = new MaterialAssetData(); mi.FormMaterialAsset(mats[i], isUseTexName,texDir); list.Add(mi); } } MatArray = list.ToArray(); } //处理特效中的拖尾材质 if (trailMat != null) { TrailMaterialAsset = new MaterialAssetData(); TrailMaterialAsset.FormMaterialAsset(trailMat, isUseTexName, texDir); } return RenderType != RendererType.None; } #endif #endregion #region//子类枚举 //Render类型 public enum RendererType { None, //Mesh渲染 MeshRenderer, //SkinnedMesh渲染 SkinnedMeshRenderer, //粒子渲染 ParticleSystemRenderer, //Trail渲染 TrailRenderer } #endregion } }