예제 #1
0
    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);
    }