예제 #1
0
    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);
    }
예제 #2
0
    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);
    }
예제 #3
0
    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);
    }
예제 #4
0
    //
    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);
    }
예제 #5
0
    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);
        }
    }
예제 #6
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);
    }
예제 #7
0
    //
    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);
    }
예제 #8
0
    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);
    }
예제 #9
0
    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);
    }
예제 #10
0
    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);
    }
예제 #11
0
    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);
    }