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); }