public IEnumerable DoCheckCharacterCoroutine(string prefabName, GameObject char_go) { List <GameObject> rendererList = new List <GameObject>(); CUnityUtil.FindChildLeaf(typeof(SkinnedMeshRenderer), typeof(MeshRenderer), char_go, rendererList); foreach (var go in rendererList) { Material[] materials; SkinnedMeshRenderer renderer = go.GetComponent <SkinnedMeshRenderer>(); if (renderer != null) { materials = renderer.sharedMaterials == null ? renderer.materials : renderer.sharedMaterials; } else { MeshRenderer meshRenderer = go.GetComponent <MeshRenderer>(); materials = meshRenderer.sharedMaterials == null ? meshRenderer.materials : meshRenderer.sharedMaterials; } for (int i = 0; i < materials.Length; ++i) { Material mat = materials[i]; if (IsPlayerPart(prefabName, go.name)) { continue; } if (mat == null) { continue; } Shader shader = mat.shader; if (shader == null) { continue; } AddCharacterShader(shader.name, mat.shaderKeywords); // CheckShader_Standard(shader.name, mat.name, go.name, prefabName); CheckShader_NoUsed_GrabPass(shader.name, mat.name, go.name, prefabName); CheckShader_KriptoFXParticle(shader.name, mat.name, go.name, prefabName, mat.shaderKeywords); CheckShader_Distortion(shader.name, mat.name, go.name, prefabName, false); CheckShader_DepthTexture(shader.name, mat.name, go.name, prefabName); CheckShader_CutoutBorder(shader.name, mat.name, go.name, prefabName); CheckShader_NoOutput(shader.name, mat.name, go.name, prefabName); } } yield return(null); }
IEnumerable DoCheckMeshRendererCoroutine(string prefabName, GameObject scenePrefab) { //string shortName = System.IO.Path.GetFileNameWithoutExtension(prefabName); List <GameObject> rendererList = new List <GameObject>(); CUnityUtil.FindChildLeaf(typeof(MeshRenderer), scenePrefab, rendererList); foreach (var go in rendererList) { MeshRenderer renderer = go.GetComponent <MeshRenderer>(); Material[] materials = renderer.sharedMaterials == null ? renderer.materials : renderer.sharedMaterials; //检查 for (int i = 0; i < materials.Length; ++i) { Material mat = materials[i]; if (mat == null) { continue; } Shader shader = mat.shader; if (shader == null) { continue; } AddSceneShader(shader.name, mat.shaderKeywords); // CheckShader_Standard(shader.name, mat.name, go.name, prefabName); CheckShader_NoUsed_GrabPass(shader.name, mat.name, go.name, prefabName); CheckShader_KriptoFXParticle(shader.name, mat.name, go.name, prefabName, mat.shaderKeywords); CheckShader_Distortion(shader.name, mat.name, go.name, prefabName, false); CheckShader_DepthTexture(shader.name, mat.name, go.name, prefabName); CheckShader_CutoutBorder(shader.name, mat.name, go.name, prefabName); CheckShader_NoOutput(shader.name, mat.name, go.name, prefabName); } } yield return(null); }
IEnumerable DoCheckMeshRendererCoroutine(string prefabName, GameObject scenePrefab) { List <GameObject> rendererList = new List <GameObject>(); CUnityUtil.FindChildLeaf(typeof(MeshRenderer), scenePrefab, rendererList); CBlockMeshInfo meshInfo = new CBlockMeshInfo(); //检查每个包含MeshRenderer的go foreach (var go in rendererList) { //MeshRenderer renderer = go.GetComponent<MeshRenderer>(); MeshFilter[] meshes = go.GetComponentsInChildren <MeshFilter>(); int nFaces = 0; foreach (var ms in meshes) { Mesh mesh = ms.sharedMesh != null ? ms.sharedMesh : ms.mesh; nFaces += mesh.triangles.Length / 3; } var entry = new CMeshEntry() { name = go.name, parent = prefabName, faces = nFaces, }; meshInfo.meshList.Add(entry); _ListEntries.Add(entry); } meshInfo.Sort(); _DicPrefabMeshInfo.Add(prefabName, meshInfo); yield return(null); }
// public IEnumerable DoCheckSkinMeshRendererCoroutine(string prefabName, GameObject scenePrefab) { List <string> errorList_MaterialMissing = new List <string>(); HashSet <string> errorSet_MaterialMissing = new HashSet <string>(); List <string> errorList_MaterialShaderMissing = new List <string>(); HashSet <string> errorSet_MaterialShaderMissing = new HashSet <string>(); List <string> errorList_MaterialShaderError = new List <string>(); HashSet <string> errorSet_MaterialShaderError = new HashSet <string>(); List <string> errorList_TextureLarge = new List <string>(); HashSet <string> errorSet_TextureLarge = new HashSet <string>(); List <string> errorList_TextureNPT = new List <string>(); HashSet <string> errorSet_TextureNPT = new HashSet <string>(); List <string> errorList_TextureNull = new List <string>(); //HashSet<string> errorSet_TextureNull = new HashSet<string>(); List <GameObject> rendererList = new List <GameObject>(); CUnityUtil.FindChildLeaf(typeof(SkinnedMeshRenderer), typeof(MeshRenderer), scenePrefab, rendererList); //检查每个包含MeshRenderer的go foreach (var go in rendererList) { Material[] materials; SkinnedMeshRenderer renderer = go.GetComponent <SkinnedMeshRenderer>(); if (renderer != null) { materials = renderer.sharedMaterials == null ? renderer.materials : renderer.sharedMaterials; } else { MeshRenderer meshRenderer = go.GetComponent <MeshRenderer>(); materials = meshRenderer.sharedMaterials == null ? meshRenderer.materials : meshRenderer.sharedMaterials; } //检查 for (int i = 0; i < materials.Length; ++i) { Material mat = materials[i]; if (IsPlayerPart(prefabName, go.name)) { if (mat != null) { _ErrorString += string.Format("{0} player部位的material必须为null! 组件名: {1}", prefabName, go.name); } continue; } if (mat == null) { string strMsg = string.Format("{0} material丢失! 组件名: {1} 材质: {2}\n", prefabName, go.name, i); if (!errorSet_MaterialMissing.Contains(strMsg)) { errorSet_MaterialMissing.Add(strMsg); errorList_MaterialMissing.Add(strMsg); } continue; } Shader shader = mat.shader; if (shader == null) { string strMsg = string.Format("{0} material shader 丢失! 组件名: {1} 材质: {2}\n", prefabName, go.name, i); if (!errorSet_MaterialShaderMissing.Contains(mat.name)) { errorSet_MaterialShaderMissing.Add(mat.name); errorList_MaterialShaderMissing.Add(strMsg); } continue; } if ((!shader.name.Contains("Standard")) && (shader.name.Contains("ErrorShader"))) { string strMsg = string.Format("{0} material shader 错误! 组件名: {1} 材质: {2}, shader名称: {3}\n", prefabName, go.name, i, shader.name); if (!errorSet_MaterialShaderError.Contains(mat.name)) { errorSet_MaterialShaderError.Add(mat.name); errorList_MaterialShaderError.Add(strMsg); } continue; } #if UNITY_EDITOR for (int innerIndex = 0; innerIndex < UnityEditor.ShaderUtil.GetPropertyCount(shader); ++innerIndex) { if (UnityEditor.ShaderUtil.GetPropertyType(shader, innerIndex) == UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv) { string propertyName = UnityEditor.ShaderUtil.GetPropertyName(shader, innerIndex); Texture tex = mat.GetTexture(propertyName); if (tex != null) { if (tex.width > TextureLimit || tex.height > TextureLimit) { string strMsg = string.Format("{0} 贴图大小大于{1},建议缩小! 组件名: {2} 材质: {3} 宽高: {4} {5} 贴图: {6} \n", prefabName, TextureLimit, go.name, i, tex.width, tex.height, tex.name); //排除允许过大贴图的一些目录 bool bSpecial = prefabName.Contains("/Boss/") || prefabName.Contains("/Fashion/") || (prefabName.Contains("/Outward/") && prefabName.Contains("/equipment/")) || prefabName.Contains("/Ride/") || prefabName.Contains("/wing/") || prefabName.Contains("_create_"); if (!bSpecial) { AddToTextureInfoList(LargeTextureList, prefabName, go.name, tex.name, tex.width, tex.height); if (!errorSet_TextureLarge.Contains(tex.name)) { errorSet_TextureLarge.Add(tex.name); errorList_TextureLarge.Add(strMsg); } } } if (tex.width != tex.height || !GameDataCheckMan.IsPOT((uint)tex.width)) { string strMsg = string.Format("{0} 贴图长宽不相等或不是2的n次幂,无法压缩,建议修改! 组件名: {1} 材质: {2} 宽高: {3} {4} 贴图: {5} \n", prefabName, go.name, i, tex.width, tex.height, tex.name); AddToTextureInfoList(NoStandardTextureList, prefabName, go.name, tex.name, tex.width, tex.height); if (!errorSet_TextureNPT.Contains(tex.name)) { errorSet_TextureNPT.Add(tex.name); errorList_TextureNPT.Add(strMsg); } } } else { // if (false) //(propertyName == "_MainTex") // { // string strMsg = string.Format("{0} 贴图为空! 组件名: {1} 材质: {2} 贴图: {3}\n", prefabName, go.name, i, propertyName); // if (!errorSet_TextureNull.Contains(strMsg)) // { // errorSet_TextureNull.Add(strMsg); // errorList_TextureNull.Add(strMsg); // } // } } } } #endif } } //输出错误信息 foreach (var str in errorList_MaterialMissing) { _ErrorString += str; } foreach (var str in errorList_MaterialShaderMissing) { _ErrorString += str; } foreach (var str in errorList_MaterialShaderError) { _ErrorString += str; } foreach (var str in errorList_TextureLarge) { _ErrorString += str; } foreach (var str in errorList_TextureNPT) { _ErrorString += str; } foreach (var str in errorList_TextureNull) { _ErrorString += str; } yield return(null); }
private IEnumerable DoCheckMeshRendererCoroutine(string prefabName, SceneConfig config) { string shortName = System.IO.Path.GetFileNameWithoutExtension(prefabName); Transform blockRootTran = config.transform.Find("BlockObjects"); if (null == blockRootTran) { blockRootTran = config.transform; } int count = 0; int total = config._BlockPositionList.Count; foreach (SceneConfig.CPositionSetting currentPos in config._BlockPositionList) { ++count; string blockName = System.IO.Path.GetFileName(currentPos._BlockName); GameDataCheckMan.Instance.SetDesc(string.Format("{0} 检查Obj: {1}", shortName, blockName)); GameDataCheckMan.Instance.SetPartProgress((float)count / total); yield return(null); var asset = AssetBundleCheck.Instance.LoadAsset(currentPos._BlockName); if (asset == null) { continue; } //创建 //TextLogger.Instance.WriteLine(string.Format("Checking Scene Object: {0}", currentPos._BlockName)); var obj = GameObject.Instantiate(asset) as GameObject; obj.transform.parent = blockRootTran; List <GameObject> rendererList = new List <GameObject>(); CUnityUtil.FindChildLeaf(typeof(MeshRenderer), obj, rendererList); //检查每个包含MeshRenderer的go foreach (var go in rendererList) { MeshRenderer renderer = go.GetComponent <MeshRenderer>(); Material[] materials = renderer.sharedMaterials == null ? renderer.materials : renderer.sharedMaterials; for (int i = 0; i < materials.Length; ++i) { Material mat = materials[i]; if (mat == null) { continue; } Shader shader = mat.shader; if (shader == null) { continue; } AddSceneShader(shader.name, mat.shaderKeywords); // CheckShader_Standard(shader.name, mat.name, go.name, prefabName); CheckShader_NoUsed_GrabPass(shader.name, mat.name, go.name, prefabName); CheckShader_KriptoFXParticle(shader.name, mat.name, go.name, prefabName, mat.shaderKeywords); CheckShader_Distortion(shader.name, mat.name, go.name, prefabName, false); CheckShader_DepthTexture(shader.name, mat.name, go.name, prefabName); CheckShader_CutoutBorder(shader.name, mat.name, go.name, prefabName); CheckShader_NoOutput(shader.name, mat.name, go.name, prefabName); } } GameObject.DestroyImmediate(obj); } }
public IEnumerable DoCheckSfxCoroutine(string prefabName, GameObject sfx_go) { List <GameObject> rendererList = new List <GameObject>(); CUnityUtil.FindChildLeaf(typeof(ParticleSystem), typeof(MeshRenderer), sfx_go, rendererList); bool hasLOD = sfx_go.GetComponent <FxLOD>(); foreach (var go in rendererList) { Material[] materials = null; ParticleSystem ps = go.GetComponent <ParticleSystem>(); if (ps != null) { ParticleSystemRenderer renderer = ps.GetComponent <ParticleSystemRenderer>(); if (renderer != null && renderer.enabled) { materials = renderer.sharedMaterials == null ? renderer.materials : renderer.sharedMaterials; } } else { MeshRenderer renderer = go.GetComponent <MeshRenderer>(); if (renderer != null && renderer.enabled) { materials = renderer.sharedMaterials == null ? renderer.materials : renderer.sharedMaterials; } } if (materials == null) { continue; } //是否为L3 GameObject bool isL3 = hasLOD && CUnityUtil.HasNameInParent(go, sfx_go, "_L3"); for (int i = 0; i < materials.Length; ++i) { Material mat = materials[i]; if (mat == null) { continue; } Shader shader = mat.shader; if (shader == null) { continue; } AddSfxShader(shader.name, mat.shaderKeywords); // CheckShader_Standard(shader.name, mat.name, go.name, prefabName); CheckShader_NoUsed_GrabPass(shader.name, mat.name, go.name, prefabName); CheckShader_KriptoFXParticle(shader.name, mat.name, go.name, prefabName, mat.shaderKeywords); CheckShader_Distortion(shader.name, mat.name, go.name, prefabName, isL3); CheckShader_DepthTexture(shader.name, mat.name, go.name, prefabName); CheckShader_CutoutBorder(shader.name, mat.name, go.name, prefabName); CheckShader_NoOutput(shader.name, mat.name, go.name, prefabName); } } foreach (var go in rendererList) { Material[] materials = null; ParticleSystem ps = go.GetComponent <ParticleSystem>(); if (ps == null || ps.shape.shapeType != ParticleSystemShapeType.MeshRenderer) { continue; } if (ps.shape.meshRenderer != null) { materials = ps.shape.meshRenderer.sharedMaterials == null ? ps.shape.meshRenderer.materials : ps.shape.meshRenderer.sharedMaterials; } if (materials == null) { continue; } //是否为L3 GameObject bool isL3 = hasLOD && CUnityUtil.HasNameInParent(go, sfx_go, "_L3"); for (int i = 0; i < materials.Length; ++i) { Material mat = materials[i]; if (mat == null) { continue; } Shader shader = mat.shader; if (shader == null) { continue; } AddSfxShader(shader.name, mat.shaderKeywords); // CheckShader_Standard(shader.name + " [ps.shader.meshRenderer]", mat.name, go.name, prefabName); CheckShader_NoUsed_GrabPass(shader.name, mat.name, go.name, prefabName); CheckShader_KriptoFXParticle(shader.name, mat.name, go.name, prefabName, mat.shaderKeywords); CheckShader_Distortion(shader.name, mat.name, go.name, prefabName, isL3); CheckShader_DepthTexture(shader.name, mat.name, go.name, prefabName); CheckShader_CutoutBorder(shader.name, mat.name, go.name, prefabName); CheckShader_NoOutput(shader.name, mat.name, go.name, prefabName); } } foreach (var go in rendererList) { Material[] materials = null; ParticleSystem ps = go.GetComponent <ParticleSystem>(); if (ps == null || ps.shape.shapeType != ParticleSystemShapeType.SkinnedMeshRenderer) { continue; } if (ps.shape.skinnedMeshRenderer != null) { materials = ps.shape.skinnedMeshRenderer.sharedMaterials == null ? ps.shape.skinnedMeshRenderer.materials : ps.shape.skinnedMeshRenderer.sharedMaterials; } if (materials == null) { continue; } //是否为L3 GameObject bool isL3 = hasLOD && CUnityUtil.HasNameInParent(go, sfx_go, "_L3"); for (int i = 0; i < materials.Length; ++i) { Material mat = materials[i]; if (mat == null) { continue; } Shader shader = mat.shader; if (shader == null) { continue; } AddSfxShader(shader.name, mat.shaderKeywords); // CheckShader_Standard(shader.name + " ps.shape.skinnedMeshRenderer", mat.name, go.name, prefabName); CheckShader_NoUsed_GrabPass(shader.name, mat.name, go.name, prefabName); CheckShader_KriptoFXParticle(shader.name, mat.name, go.name, prefabName, mat.shaderKeywords); CheckShader_Distortion(shader.name, mat.name, go.name, prefabName, isL3); CheckShader_DepthTexture(shader.name, mat.name, go.name, prefabName); CheckShader_CutoutBorder(shader.name, mat.name, go.name, prefabName); CheckShader_NoOutput(shader.name, mat.name, go.name, prefabName); } } yield return(null); }
// public IEnumerable DoCheckParticleSystemCoroutine(string prefabName, GameObject sfxPrefab) { List <string> errorList_MaterialMissing = new List <string>(); HashSet <string> errorSet_MaterialMissing = new HashSet <string>(); List <string> errorList_MaterialShaderMissing = new List <string>(); HashSet <string> errorSet_MaterialShaderMissing = new HashSet <string>(); List <string> errorList_MaterialShaderError = new List <string>(); HashSet <string> errorSet_MaterialShaderError = new HashSet <string>(); List <string> errorList_TextureLarge = new List <string>(); HashSet <string> errorSet_TextureLarge = new HashSet <string>(); List <string> errorList_TextureNPT = new List <string>(); HashSet <string> errorSet_TextureNPT = new HashSet <string>(); List <string> errorList_TextureNull = new List <string>(); //HashSet<string> errorSet_TextureNull = new HashSet<string>(); List <GameObject> rendererList = new List <GameObject>(); CUnityUtil.FindChildLeaf(typeof(ParticleSystem), typeof(MeshRenderer), sfxPrefab, rendererList); foreach (var go in rendererList) { Material[] materials = null; ParticleSystem ps = go.GetComponent <ParticleSystem>(); if (ps != null) { ParticleSystemRenderer renderer = ps.GetComponent <ParticleSystemRenderer>(); if (renderer != null && renderer.enabled) { materials = renderer.sharedMaterials == null ? renderer.materials : renderer.sharedMaterials; } } else { MeshRenderer renderer = go.GetComponent <MeshRenderer>(); if (renderer != null && renderer.enabled) { materials = renderer.sharedMaterials == null ? renderer.materials : renderer.sharedMaterials; } } if (materials == null) { continue; } //检查 for (int i = 0; i < materials.Length; ++i) { Material mat = materials[i]; if (mat == null) { if (i == 0) { string strMsg = string.Format("{0} material丢失! prefab: {1}\n", prefabName, go.name); if (!errorSet_MaterialMissing.Contains(strMsg)) { errorSet_MaterialMissing.Add(strMsg); errorList_MaterialMissing.Add(strMsg); } } continue; } Shader shader = mat.shader; if (shader == null) { string strMsg = string.Format("{0} material shader 丢失! prefab: {1}\n", prefabName, go.name); if (!errorSet_MaterialShaderMissing.Contains(mat.name)) { errorSet_MaterialShaderMissing.Add(mat.name); errorList_MaterialShaderMissing.Add(strMsg); } continue; } if ((!shader.name.Contains("Standard")) && (shader.name.Contains("ErrorShader"))) { string strMsg = string.Format("{0} material shader 错误! prefab: {1} shader名称: {2}\n", prefabName, go.name, shader.name); if (!errorSet_MaterialShaderError.Contains(mat.name)) { errorSet_MaterialShaderError.Add(mat.name); errorList_MaterialShaderError.Add(strMsg); } continue; } #if UNITY_EDITOR for (int innerIndex = 0; innerIndex < UnityEditor.ShaderUtil.GetPropertyCount(shader); ++innerIndex) { if (UnityEditor.ShaderUtil.GetPropertyType(shader, innerIndex) == UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv) { string propertyName = UnityEditor.ShaderUtil.GetPropertyName(shader, innerIndex); Texture tex = mat.GetTexture(propertyName); if (tex != null) { if (tex.width > TextureLimit || tex.height > TextureLimit) { string strMsg = string.Format("{0} 贴图大小大于{1},建议缩小! prefab: {2} 宽高: {3} {4} 贴图: {5} \n", prefabName, TextureLimit, go.name, tex.width, tex.height, tex.name); if (!errorSet_TextureLarge.Contains(tex.name)) { errorSet_TextureLarge.Add(tex.name); errorList_TextureLarge.Add(strMsg); } } if (tex.width != tex.height || !GameDataCheckMan.IsPOT((uint)tex.width)) { string strMsg = string.Format("{0} 贴图长宽不相等或不是2的n次幂,无法压缩,建议修改! prefab: {1} 材质: {2} 宽高: {3} {4} 贴图: {5} \n", prefabName, go.name, innerIndex, tex.width, tex.height, tex.name); if (!errorSet_TextureNPT.Contains(tex.name)) { errorSet_TextureNPT.Add(tex.name); errorList_TextureNPT.Add(strMsg); } } } else { // if (false) //(propertyName == "_MainTex") // { // string strMsg = string.Format("{0} 贴图为空! prefab: {1} 贴图: {3}\n", prefabName, go.name, propertyName); // if (!errorSet_TextureNull.Contains(strMsg)) // { // errorSet_TextureNull.Add(strMsg); // errorList_TextureNull.Add(strMsg); // } // } } } } #endif } } foreach (var go in rendererList) { Material[] materials = null; ParticleSystem ps = go.GetComponent <ParticleSystem>(); if (ps == null || ps.shape.shapeType != ParticleSystemShapeType.MeshRenderer) { continue; } if (ps.shape.meshRenderer != null) { materials = ps.shape.meshRenderer.sharedMaterials == null ? ps.shape.meshRenderer.materials : ps.shape.meshRenderer.sharedMaterials; } if (materials == null) { continue; } //检查 for (int i = 0; i < materials.Length; ++i) { Material mat = materials[i]; if (mat == null) { if (i == 0) { string strMsg = string.Format("{0} ParticleSystem.shape.meshRenderer material丢失! prefab: {1} 材质: {2}\n", prefabName, go.name, i); if (!errorSet_MaterialMissing.Contains(strMsg)) { errorSet_MaterialMissing.Add(strMsg); errorList_MaterialMissing.Add(strMsg); } } continue; } Shader shader = mat.shader; if (shader == null) { string strMsg = string.Format("{0} ParticleSystem.shape.meshRenderer material shader 丢失! prefab: {1} 材质: {2}\n", prefabName, go.name, i); if (!errorSet_MaterialShaderMissing.Contains(mat.name)) { errorSet_MaterialShaderMissing.Add(mat.name); errorList_MaterialShaderMissing.Add(strMsg); } continue; } if ((!shader.name.Contains("Standard")) && (shader.name.Contains("ErrorShader"))) { string strMsg = string.Format("{0} ParticleSystem.shape.meshRenderer material shader 错误! prefab: {1} 材质: {2}, shader名称: {3}\n", prefabName, go.name, i, shader.name); if (!errorSet_MaterialShaderError.Contains(mat.name)) { errorSet_MaterialShaderError.Add(mat.name); errorList_MaterialShaderError.Add(strMsg); } continue; } #if UNITY_EDITOR for (int innerIndex = 0; innerIndex < UnityEditor.ShaderUtil.GetPropertyCount(shader); ++innerIndex) { if (UnityEditor.ShaderUtil.GetPropertyType(shader, innerIndex) == UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv) { string propertyName = UnityEditor.ShaderUtil.GetPropertyName(shader, innerIndex); Texture tex = mat.GetTexture(propertyName); if (tex != null) { if (tex.width > TextureLimit || tex.height > TextureLimit) { string strMsg = string.Format("{0} 贴图大小大于{1},建议缩小! prefab: {2} 材质: {3} 宽高: {4} {5} 贴图: {6} \n", prefabName, TextureLimit, go.name, i, tex.width, tex.height, tex.name); if (!errorSet_TextureLarge.Contains(tex.name)) { errorSet_TextureLarge.Add(tex.name); errorList_TextureLarge.Add(strMsg); } } if (tex.width != tex.height || !GameDataCheckMan.IsPOT((uint)tex.width)) { string strMsg = string.Format("{0} 贴图长宽不相等或不是2的n次幂,无法压缩,建议修改! prefab: {1} 材质: {2} 宽高: {3} {4} 贴图: {5} \n", prefabName, go.name, i, tex.width, tex.height, tex.name); if (!errorSet_TextureNPT.Contains(tex.name)) { errorSet_TextureNPT.Add(tex.name); errorList_TextureNPT.Add(strMsg); } } } else { // if (false) //(propertyName == "_MainTex") // { // string strMsg = string.Format("{0} 贴图为空! prefab: {1} 材质: {2} 贴图: {3}\n", prefabName, go.name, i, propertyName); // if (!errorSet_TextureNull.Contains(strMsg)) // { // errorSet_TextureNull.Add(strMsg); // errorList_TextureNull.Add(strMsg); // } // } } } } #endif } } foreach (var go in rendererList) { Material[] materials = null; ParticleSystem ps = go.GetComponent <ParticleSystem>(); if (ps == null || ps.shape.shapeType != ParticleSystemShapeType.SkinnedMeshRenderer) { continue; } if (ps.shape.skinnedMeshRenderer != null) { materials = ps.shape.skinnedMeshRenderer.sharedMaterials == null ? ps.shape.skinnedMeshRenderer.materials : ps.shape.skinnedMeshRenderer.sharedMaterials; } if (materials == null) { continue; } //检查 for (int i = 0; i < materials.Length; ++i) { Material mat = materials[i]; if (mat == null) { if (i == 0) { string strMsg = string.Format("{0} ParticleSystem.shape.skinnedMeshRenderer material丢失! prefab: {1} 材质: {2}\n", prefabName, go.name, i); if (!errorSet_MaterialMissing.Contains(strMsg)) { errorSet_MaterialMissing.Add(strMsg); errorList_MaterialMissing.Add(strMsg); } } continue; } Shader shader = mat.shader; if (shader == null) { string strMsg = string.Format("{0} ParticleSystem.shape.skinnedMeshRenderer material shader 丢失! prefab: {1} 材质: {2}\n", prefabName, go.name, i); if (!errorSet_MaterialShaderMissing.Contains(mat.name)) { errorSet_MaterialShaderMissing.Add(mat.name); errorList_MaterialShaderMissing.Add(strMsg); } continue; } if ((!shader.name.Contains("Standard")) && (shader.name.Contains("ErrorShader"))) { string strMsg = string.Format("{0} ParticleSystem.shape.skinnedMeshRenderer material shader 错误! prefab: {1} 材质: {2}, shader名称: {3}\n", prefabName, go.name, i, shader.name); if (!errorSet_MaterialShaderError.Contains(mat.name)) { errorSet_MaterialShaderError.Add(mat.name); errorList_MaterialShaderError.Add(strMsg); } continue; } #if UNITY_EDITOR for (int innerIndex = 0; innerIndex < UnityEditor.ShaderUtil.GetPropertyCount(shader); ++innerIndex) { if (UnityEditor.ShaderUtil.GetPropertyType(shader, innerIndex) == UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv) { string propertyName = UnityEditor.ShaderUtil.GetPropertyName(shader, innerIndex); Texture tex = mat.GetTexture(propertyName); if (tex != null) { if (tex.width > TextureLimit || tex.height > TextureLimit) { string strMsg = string.Format("{0} 贴图大小大于{1},建议缩小! prefab: {2} 材质: {3} 宽高: {4} {5} 贴图: {6} \n", prefabName, TextureLimit, go.name, i, tex.width, tex.height, tex.name); if (!errorSet_TextureLarge.Contains(tex.name)) { errorSet_TextureLarge.Add(tex.name); errorList_TextureLarge.Add(strMsg); } } if (tex.width != tex.height || !GameDataCheckMan.IsPOT((uint)tex.width)) { string strMsg = string.Format("{0} 贴图长宽不相等或不是2的n次幂,无法压缩,建议修改! prefab: {1} 材质: {2} 宽高: {3} {4} 贴图: {5} \n", prefabName, go.name, i, tex.width, tex.height, tex.name); if (!errorSet_TextureNPT.Contains(tex.name)) { errorSet_TextureNPT.Add(tex.name); errorList_TextureNPT.Add(strMsg); } } } else { // if (false) //(propertyName == "_MainTex") // { // string strMsg = string.Format("{0} 贴图为空! prefab: {1} 材质: {2} 贴图: {3}\n", prefabName, go.name, i, propertyName); // if (!errorSet_TextureNull.Contains(strMsg)) // { // errorSet_TextureNull.Add(strMsg); // errorList_TextureNull.Add(strMsg); // } // } } } } #endif } } //输出错误信息 foreach (var str in errorList_MaterialMissing) { _ErrorString += str; } foreach (var str in errorList_MaterialShaderMissing) { _ErrorString += str; } foreach (var str in errorList_MaterialShaderError) { _ErrorString += str; } foreach (var str in errorList_TextureLarge) { _ErrorString += str; } foreach (var str in errorList_TextureNPT) { _ErrorString += str; } foreach (var str in errorList_TextureNull) { _ErrorString += str; } yield return(null); }
IEnumerable DoCheckMeshRendererCoroutine(string prefabName, GameObject scenePrefab) { string shortName = System.IO.Path.GetFileNameWithoutExtension(prefabName); List <string> errorList_MaterialMissing = new List <string>(); HashSet <string> errorSet_MaterialMissing = new HashSet <string>(); List <string> errorList_MaterialShaderMissing = new List <string>(); HashSet <string> errorSet_MaterialShaderMissing = new HashSet <string>(); List <string> errorList_MaterialShaderError = new List <string>(); HashSet <string> errorSet_MaterialShaderError = new HashSet <string>(); List <string> errorList_TextureLarge = new List <string>(); HashSet <string> errorSet_TextureLarge = new HashSet <string>(); List <string> errorList_TextureNPT = new List <string>(); HashSet <string> errorSet_TextureNPT = new HashSet <string>(); List <string> errorList_TextureNull = new List <string>(); //HashSet<string> errorSet_TextureNull = new HashSet<string>(); List <GameObject> rendererList = new List <GameObject>(); CUnityUtil.FindChildLeaf(typeof(MeshRenderer), scenePrefab, rendererList); //检查每个包含MeshRenderer的go foreach (var go in rendererList) { MeshRenderer renderer = go.GetComponent <MeshRenderer>(); Material[] materials = renderer.sharedMaterials == null ? renderer.materials : renderer.sharedMaterials; //检查 for (int i = 0; i < materials.Length; ++i) { Material mat = materials[i]; if (mat == null) { string strMsg = string.Format("{0} material丢失! prefab: {1} 材质: {2}\n", prefabName, go.name, i); if (!errorSet_MaterialMissing.Contains(strMsg)) { errorSet_MaterialMissing.Add(strMsg); errorList_MaterialMissing.Add(strMsg); } continue; } Shader shader = mat.shader; if (shader == null) { string strMsg = string.Format("{0} material shader 丢失! prefab: {1} 材质: {2}\n", prefabName, go.name, i); if (!errorSet_MaterialShaderMissing.Contains(mat.name)) { errorSet_MaterialShaderMissing.Add(mat.name); errorList_MaterialShaderMissing.Add(strMsg); } continue; } if ((!shader.name.Contains("Standard")) && (shader.name.Contains("ErrorShader"))) { string strMsg = string.Format("{0} material shader 错误! prefab: {1} 材质: {2}, shader名称: {3}\n", prefabName, go.name, i, shader.name); if (!errorSet_MaterialShaderError.Contains(mat.name)) { errorSet_MaterialShaderError.Add(mat.name); errorList_MaterialShaderError.Add(strMsg); } continue; } #if UNITY_EDITOR for (int innerIndex = 0; innerIndex < UnityEditor.ShaderUtil.GetPropertyCount(shader); ++innerIndex) { if (UnityEditor.ShaderUtil.GetPropertyType(shader, innerIndex) == UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv) { string propertyName = UnityEditor.ShaderUtil.GetPropertyName(shader, innerIndex); Texture tex = mat.GetTexture(propertyName); if (tex != null) { if (tex.width > TextureLimit || tex.height > TextureLimit) { string strMsg = string.Format("{0} 贴图大小大于{1},建议缩小! prefab: {2} 材质: {3} 宽高: {4} {5} 贴图: {6} \n", prefabName, TextureLimit, go.name, i, tex.width, tex.height, tex.name); if (!errorSet_TextureLarge.Contains(tex.name)) { errorSet_TextureLarge.Add(tex.name); errorList_TextureLarge.Add(strMsg); } } if (tex.width != tex.height || !GameDataCheckMan.IsPOT((uint)tex.width)) { string strMsg = string.Format("{0} 贴图长宽不相等或不是2的n次幂,无法压缩,建议修改! prefab: {1} 材质: {2} 宽高: {3} {4} 贴图: {5} \n", prefabName, go.name, i, tex.width, tex.height, tex.name); if (!errorSet_TextureNPT.Contains(tex.name)) { errorSet_TextureNPT.Add(tex.name); errorList_TextureNPT.Add(strMsg); } } } else { // if (false) //if (propertyName == "_MainTex") // { // string strMsg = string.Format("{0} 贴图为空! prefab: {1} 材质: {2} 贴图: {3}\n", prefabName, go.name, i, propertyName); // if (!errorSet_TextureNull.Contains(strMsg)) // { // errorSet_TextureNull.Add(strMsg); // errorList_TextureNull.Add(strMsg); // } // } } } } #endif } } //输出错误信息 foreach (var str in errorList_MaterialMissing) { AddErrorString(shortName, str); } foreach (var str in errorList_MaterialShaderMissing) { AddErrorString(shortName, str); } foreach (var str in errorList_MaterialShaderError) { AddErrorString(shortName, str); } foreach (var str in errorList_TextureLarge) { AddErrorString(shortName, str); } foreach (var str in errorList_TextureNPT) { AddErrorString(shortName, str); } foreach (var str in errorList_TextureNull) { AddErrorString(shortName, str); } yield return(null); }
private IEnumerable DoCheckMeshRendererCoroutine(string prefabName, SceneConfig config) { string shortName = System.IO.Path.GetFileNameWithoutExtension(prefabName); List <string> errorList_MaterialMissing = new List <string>(); HashSet <string> errorSet_MaterialMissing = new HashSet <string>(); List <string> errorList_MaterialShaderMissing = new List <string>(); HashSet <string> errorSet_MaterialShaderMissing = new HashSet <string>(); List <string> errorList_MaterialShaderError = new List <string>(); HashSet <string> errorSet_MaterialShaderError = new HashSet <string>(); List <string> errorList_TextureLarge = new List <string>(); HashSet <string> errorSet_TextureLarge = new HashSet <string>(); List <string> errorList_TextureNPT = new List <string>(); HashSet <string> errorSet_TextureNPT = new HashSet <string>(); List <string> errorList_TextureNull = new List <string>(); //HashSet<string> errorSet_TextureNull = new HashSet<string>(); Transform blockRootTran = config.transform.Find("BlockObjects"); if (null == blockRootTran) { blockRootTran = config.transform; } int count = 0; int total = config._BlockPositionList.Count; foreach (SceneConfig.CPositionSetting currentPos in config._BlockPositionList) { ++count; string blockName = System.IO.Path.GetFileName(currentPos._BlockName); GameDataCheckMan.Instance.SetDesc(string.Format("{0} 检查Obj: {1}", shortName, blockName)); GameDataCheckMan.Instance.SetPartProgress((float)count / total); yield return(null); var asset = AssetBundleCheck.Instance.LoadAsset(currentPos._BlockName); if (asset == null) { AddErrorStringFormat(shortName, "terrain加载Object错误: {0}\n", currentPos._BlockName); continue; } //创建 //TextLogger.Instance.WriteLine(string.Format("Checking Scene Object: {0}", currentPos._BlockName)); var obj = GameObject.Instantiate(asset) as GameObject; obj.transform.parent = blockRootTran; List <GameObject> rendererList = new List <GameObject>(); CUnityUtil.FindChildLeaf(typeof(MeshRenderer), obj, rendererList); //检查每个包含MeshRenderer的go foreach (var go in rendererList) { MeshRenderer renderer = go.GetComponent <MeshRenderer>(); Material[] materials = renderer.sharedMaterials == null ? renderer.materials : renderer.sharedMaterials; //检查 for (int i = 0; i < materials.Length; ++i) { Material mat = materials[i]; if (mat == null) { string strMsg = string.Format("{0} material丢失! prefab: {1} 材质: {2}\n", prefabName, go.name, i); if (!errorSet_MaterialMissing.Contains(strMsg)) { errorSet_MaterialMissing.Add(strMsg); errorList_MaterialMissing.Add(strMsg); } continue; } Shader shader = mat.shader; if (shader == null) { string strMsg = string.Format("{0} material shader 丢失! prefab: {1} 材质: {2}\n", prefabName, go.name, i); if (!errorSet_MaterialShaderMissing.Contains(mat.name)) { errorSet_MaterialShaderMissing.Add(mat.name); errorList_MaterialShaderMissing.Add(strMsg); } continue; } if ((!shader.name.Contains("Standard")) && (shader.name.Contains("ErrorShader"))) { string strMsg = string.Format("{0} material shader 错误! prefab: {1} 材质: {2}, shader名称: {3}\n", prefabName, go.name, i, shader.name); if (!errorSet_MaterialShaderError.Contains(mat.name)) { errorSet_MaterialShaderError.Add(mat.name); errorList_MaterialShaderError.Add(strMsg); } continue; } #if UNITY_EDITOR for (int innerIndex = 0; innerIndex < UnityEditor.ShaderUtil.GetPropertyCount(shader); ++innerIndex) { if (UnityEditor.ShaderUtil.GetPropertyType(shader, innerIndex) == UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv) { string propertyName = UnityEditor.ShaderUtil.GetPropertyName(shader, innerIndex); Texture tex = mat.GetTexture(propertyName); if (tex != null) { if (tex.width > TextureLimit || tex.height > TextureLimit) { string strMsg = string.Format("{0} 贴图大小大于{1},建议缩小! prefab: {2} 材质: {3} 宽高: {4} {5} 贴图: {6} \n", prefabName, TextureLimit, go.name, i, tex.width, tex.height, tex.name); if (!errorSet_TextureLarge.Contains(tex.name)) { errorSet_TextureLarge.Add(tex.name); errorList_TextureLarge.Add(strMsg); } } if (tex.width != tex.height || !GameDataCheckMan.IsPOT((uint)tex.width)) { string strMsg = string.Format("{0} 贴图长宽不相等或不是2的n次幂,无法压缩,建议修改! prefab: {1} 材质: {2} 宽高: {3} {4} 贴图: {5} \n", prefabName, go.name, i, tex.width, tex.height, tex.name); if (!errorSet_TextureNPT.Contains(tex.name)) { errorSet_TextureNPT.Add(tex.name); errorList_TextureNPT.Add(strMsg); } } } else { // if (false) //(propertyName == "_MainTex") // { // string strMsg = string.Format("{0} 贴图为空! prefab: {1} 材质: {2} 贴图: {3}\n", prefabName, go.name, i, propertyName); // if (!errorSet_TextureNull.Contains(strMsg)) // { // errorSet_TextureNull.Add(strMsg); // errorList_TextureNull.Add(strMsg); // } // } } } } #endif } } GameObject.DestroyImmediate(obj); } //输出错误信息 foreach (var str in errorList_MaterialMissing) { AddErrorString(shortName, str); } foreach (var str in errorList_MaterialShaderMissing) { AddErrorString(shortName, str); } foreach (var str in errorList_MaterialShaderError) { AddErrorString(shortName, str); } foreach (var str in errorList_TextureLarge) { AddErrorString(shortName, str); } foreach (var str in errorList_TextureNPT) { AddErrorString(shortName, str); } foreach (var str in errorList_TextureNull) { AddErrorString(shortName, str); } yield return(null); }
private IEnumerable DoCheckTerrains(string prefabName, GameObject scenePrefab) { var _Config = scenePrefab.GetComponent <SceneConfig>(); if (null == _Config) { yield break; } List <TerrainsManager.CTerrainEntry> _CurrentSceneTerrain = new List <TerrainsManager.CTerrainEntry>(); SceneConfig.LightmapsConfig cacheTerrainConfig = _Config._LightmapConfig; int curTerrainCount = cacheTerrainConfig._TerrainLightmapInfos.Length; _CurrentSceneTerrain.Clear(); for (int i = 0; i < curTerrainCount; i++) { Terrain terrain = cacheTerrainConfig._TerrainLightmapInfos[i]._Terrain; if (terrain == null) { continue; } if (terrain.terrainData != null) { TerrainsManager.CTerrainEntry entry = new TerrainsManager.CTerrainEntry(); entry.TerrainComp = terrain; entry.Position = terrain.transform.position; entry.SizeH = (terrain.terrainData.size.x + terrain.terrainData.size.z) * 0.5f; _CurrentSceneTerrain.Add(entry); } } //检查terrainData if (_CurrentSceneTerrain.Count > 0) //有分块 { int count = 0; int total = _CurrentSceneTerrain.Count; foreach (var entry in _CurrentSceneTerrain) { string name = entry.TerrainComp.name; TerrainData terrainData = entry.TerrainComp.terrainData; ++count; string shortName = System.IO.Path.GetFileNameWithoutExtension(prefabName); GameDataCheckMan.Instance.SetDesc(string.Format("{0} 检查Terrain: {1}", shortName, name)); GameDataCheckMan.Instance.SetPartProgress((float)count / total); yield return(null); //会导致basemap过大 if (terrainData.baseMapResolution > TerrainBaseMapSizeLimit) { //AddErrorStringFormat(shortName, "{0} 的 terrain {1} 的 BaseTextureResolution 为 {2}, 大于 {3},建议减小到{4}以内!\n", prefabName, name, terrainData.baseMapResolution, TerrainBaseMapSizeLimit, TerrainBaseMapSizeLimit); } for (int i = 0; i < terrainData.splatPrototypes.Length; ++i) { var splat = terrainData.splatPrototypes[i]; var tex = splat.texture; if (tex != null) { //if (tex.width > 512 || tex.height > 512) // _ErrorString += string.Format("{0} terrain 的 splatTexture 大小 大于 512,建议减小到512以内: {1}\n", prefabName, tex.name); bool bValid = true; string errorMsg = ""; for (int level = 0; level < tex.mipmapCount; ++level) { if (!CUnityUtil.CanGetPixel32(tex, level, out errorMsg)) { bValid = false; break; } } if (!bValid) { AddErrorStringFormat(shortName, "{0} 的 terrain {1} 的 splatTexture {2} 无法读取像素,请确保Texture开启read/write权限: {3}, Message:{4}\n", prefabName, name, i, tex.name, errorMsg); } //else // _ErrorString += string.Format("{0} terrain 的 splatTexture {1} 正常读取像素: {2}\n", prefabName, i, tex.name); } else { AddErrorStringFormat(shortName, "{0} 的 terrain {1} 的 splatTexture {2} 为空!\n", prefabName, name, i); } } if (terrainData.alphamapLayers > 4) { AddErrorStringFormat(shortName, "{0} 的 terrain {1} 的 alphamapLayers 大于 4,必须减小到4以内!\n", prefabName, name); } if (terrainData.alphamapResolution > TerrainBaseMapSizeLimit) { //AddErrorStringFormat(shortName, "{0} 的 terrain {1} 的 ControlTextureResolution 为{2}, 大于 {3},建议减小到 {4}以内!\n", prefabName, name, terrainData.alphamapResolution, TerrainBaseMapSizeLimit, TerrainBaseMapSizeLimit); } for (int i = 0; i < terrainData.alphamapTextures.Length; ++i) { var tex = terrainData.alphamapTextures[i]; if (tex != null) { //if (tex.width > TerrainBaseMapSizeLimit || tex.height > TerrainBaseMapSizeLimit) // _ErrorString += string.Format("{0} 的 terrain {1} 的 alphamapTexture 长宽 大于 {2},建议减小到{3}以内: 宽:{4} 高:{5} {6}\n", prefabName, name, TerrainBaseMapSizeLimit, TerrainBaseMapSizeLimit, tex.width, tex.height, tex.name); } else { AddErrorStringFormat(shortName, "{0} 的 terrain {1} 的 alphamapTexture {2} 为空!\n", prefabName, name, i); } } if (terrainData.detailPrototypes != null && terrainData.detailPrototypes.Length > 0) { AddErrorStringFormat(shortName, "{0} 的 terrain {1} 包含detailMap(草地??) 个数: {2},建议去掉!\n", prefabName, name, terrainData.detailPrototypes.Length); } } } else { List <GameObject> rendererList = new List <GameObject>(); CUnityUtil.FindChildLeaf(typeof(Terrain), scenePrefab, rendererList); //检查terrainData int count = 0; int total = rendererList.Count; foreach (var go in rendererList) { Terrain terrain = go.GetComponent <Terrain>(); string name = terrain.name; TerrainData terrainData = terrain.terrainData; ++count; string shortName = System.IO.Path.GetFileNameWithoutExtension(prefabName); GameDataCheckMan.Instance.SetDesc(string.Format("{0} 检查Terrain: {1}", shortName, name)); GameDataCheckMan.Instance.SetPartProgress((float)count / total); yield return(null); //会导致basemap过大 if (terrainData.baseMapResolution > TerrainBaseMapSizeLimit) { //AddErrorStringFormat(shortName, "{0} 的 terrain {1} 的 BaseTextureResolution 大于 {2},建议减小到{3}以内!\n", prefabName, name, TerrainBaseMapSizeLimit, TerrainBaseMapSizeLimit); } for (int i = 0; i < terrainData.splatPrototypes.Length; ++i) { var splat = terrainData.splatPrototypes[i]; var tex = splat.texture; if (tex != null) { //if (tex.width > 512 || tex.height > 512) // _ErrorString += string.Format("{0} terrain 的 splatTexture 大小 大于 512,建议减小到512以内: {1}\n", prefabName, tex.name); bool bValid = true; string errorMsg = ""; for (int level = 0; level < tex.mipmapCount; ++level) { if (!CUnityUtil.CanGetPixel32(tex, level, out errorMsg)) { bValid = false; break; } } if (!bValid) { AddErrorStringFormat(shortName, "{0} 的 terrain {1} 的 splatTexture {2} 无法读取像素,请确保Texture开启read/write权限: {3}, Message: {4}\n", prefabName, name, i, tex.name, errorMsg); } //else // _ErrorString += string.Format("{0} terrain 的 splatTexture {1} 正常读取像素: {2}\n", prefabName, i, tex.name); } else { AddErrorStringFormat(shortName, "{0} 的 terrain {1} 的 splatTexture {2} 为空!\n", prefabName, name, i); } } if (terrainData.alphamapLayers > 4) { AddErrorStringFormat(shortName, "{0} 的 terrain {1} 的 alphamapLayers 大于 4,必须减小到4以内!\n", prefabName, name); } if (terrainData.alphamapResolution > TerrainBaseMapSizeLimit) { //AddErrorStringFormat(shortName, "{0} 的 terrain {1} 的 ControlTextureResolution 大于 {2},建议减小到{3}以内!\n", prefabName, name, TerrainBaseMapSizeLimit, TerrainBaseMapSizeLimit); } for (int i = 0; i < terrainData.alphamapTextures.Length; ++i) { var tex = terrainData.alphamapTextures[i]; if (tex != null) { //if (tex.width > TerrainBaseMapSizeLimit || tex.height > TerrainBaseMapSizeLimit) // _ErrorString += string.Format("{0} terrain 的 alphamapTextures大小 大于 {1},建议减小到{2}以内: {3}\n", prefabName, TerrainBaseMapSizeLimit, TerrainBaseMapSizeLimit, tex.name); } else { AddErrorStringFormat(shortName, "{0} 的 terrain {1} 的 alphamapTexture {2} 为空!\n", prefabName, name, i); } } if (terrainData.detailPrototypes != null && terrainData.detailPrototypes.Length > 0) { AddErrorStringFormat(shortName, "{0} 的 terrain {1} 包含detailMap(草地??) 个数: {2},建议去掉!\n", prefabName, name, terrainData.detailPrototypes.Length); } } } yield return(null); }
IEnumerable DoCheckMeshRendererCoroutine(string prefabName, SceneConfig config) { Transform blockRootTran = config.transform.Find("BlockObjects"); if (null == blockRootTran) { blockRootTran = config.transform; } int count = 0; int total = config._BlockPositionList.Count; foreach (SceneConfig.CPositionSetting currentPos in config._BlockPositionList) { ++count; string shortName = System.IO.Path.GetFileNameWithoutExtension(prefabName); string blockName = System.IO.Path.GetFileName(currentPos._BlockName); GameDataCheckMan.Instance.SetDesc(string.Format("{0} 检查Obj: {1}", shortName, blockName)); GameDataCheckMan.Instance.SetPartProgress((float)count / total); yield return(null); var asset = AssetBundleCheck.Instance.LoadAsset(currentPos._BlockName); if (asset == null) { _ErrorString += string.Format("terrain加载Object错误: {0}\n", currentPos._BlockName); continue; } //创建 //TextLogger.Instance.WriteLine(string.Format("Checking Scene Object: {0}", currentPos._BlockName)); var obj = GameObject.Instantiate(asset) as GameObject; obj.transform.parent = blockRootTran; List <GameObject> rendererList = new List <GameObject>(); CUnityUtil.FindChildLeaf(typeof(MeshRenderer), obj, rendererList); CBlockMeshInfo meshInfo = new CBlockMeshInfo(); //检查每个包含MeshRenderer的go foreach (var go in rendererList) { //MeshRenderer renderer = go.GetComponent<MeshRenderer>(); MeshFilter[] meshes = go.GetComponentsInChildren <MeshFilter>(); int nFaces = 0; foreach (var ms in meshes) { Mesh mesh = ms.sharedMesh != null ? ms.sharedMesh : ms.mesh; nFaces += mesh.triangles.Length / 3; } var entry = new CMeshEntry() { name = go.name, parent = currentPos._BlockName, faces = nFaces, }; meshInfo.meshList.Add(entry); _ListEntries.Add(entry); } meshInfo.Sort(); _DicBlockMeshInfo.Add(currentPos._BlockName, meshInfo); GameObject.DestroyImmediate(obj); } yield return(null); }