void ScanProject() { try { if (shaders == null) { shaders = new List <SCShader>(); } else { shaders.Clear(); } // Add shaders from Resources folder string[] guids = AssetDatabase.FindAssets("t:Shader"); totalShaderCount = guids.Length; for (int k = 0; k < totalShaderCount; k++) { string guid = guids[k]; string path = AssetDatabase.GUIDToAssetPath(guid); if (path != null) { string pathUpper = path.ToUpper(); if (scanAllShaders || pathUpper.Contains("\\RESOURCES\\") || pathUpper.Contains("/RESOURCES/")) // this shader will be included in build { Shader unityShader = AssetDatabase.LoadAssetAtPath <Shader>(path); if (unityShader != null) { SCShader shader = new SCShader(); shader.fullName = unityShader.name; shader.name = SCShader.GetSimpleName(shader.fullName); // Path.GetFileNameWithoutExtension(path); shader.path = path; string shaderGUID = path + "/" + unityShader.name; shader.GUID = shaderGUID; ScanShader(shader); if (shader.keywords.Count > 0) { shaders.Add(shader); } } } } } // Load and reference materials Dictionary <string, SCShader> shaderCache = new Dictionary <string, SCShader>(shaders.Count); shaders.ForEach(shader => { shaderCache.Add(shader.GUID, shader); }); string[] matGuids = AssetDatabase.FindAssets("t:Material"); if (projectMaterials == null) { projectMaterials = new List <SCMaterial>(); } else { projectMaterials.Clear(); } for (int k = 0; k < matGuids.Length; k++) { string matGUID = matGuids[k]; string matPath = AssetDatabase.GUIDToAssetPath(matGUID); Material mat = AssetDatabase.LoadAssetAtPath <Material>(matPath); if (mat.shader == null) { continue; } SCMaterial scMat = new SCMaterial(mat, matPath, matGUID); scMat.SetKeywords(mat.shaderKeywords); if (mat.shaderKeywords != null && mat.shaderKeywords.Length > 0) { projectMaterials.Add(scMat); } string path = AssetDatabase.GetAssetPath(mat.shader); string shaderGUID = path + "/" + mat.shader.name; SCShader shader; if (!shaderCache.TryGetValue(shaderGUID, out shader)) { if (mat.shaderKeywords == null || mat.shaderKeywords.Length == 0) { continue; } Shader shad = AssetDatabase.LoadAssetAtPath <Shader>(path); // add non-sourced shader shader = new SCShader(); shader.isReadOnly = IsFileWritable(path); shader.GUID = shaderGUID; if (shad != null) { shader.fullName = shad.name; shader.name = SCShader.GetSimpleName(shader.fullName); shader.path = path; ScanShader(shader); } else { shader.fullName = mat.shader.name; shader.name = SCShader.GetSimpleName(shader.fullName); } shaders.Add(shader); shaderCache.Add(shaderGUID, shader); totalShaderCount++; } shader.materials.Add(scMat); shader.AddKeywordsByName(mat.shaderKeywords); } // sort materials by name projectMaterials.Sort(CompareMaterialsName); // refresh variant and keywords count due to potential additional added keywords from materials (rogue keywords) and shader features count maxKeywordsCountFound = 0; shaders.ForEach((SCShader shader) => { if (shader.keywordEnabledCount > maxKeywordsCountFound) { maxKeywordsCountFound = shader.keywordEnabledCount; } shader.UpdateVariantCount(); }); switch (sortType) { case SortType.VariantsCount: shaders.Sort((SCShader x, SCShader y) => { return(y.actualBuildVariantCount.CompareTo(x.actualBuildVariantCount)); }); break; case SortType.EnabledKeywordsCount: shaders.Sort((SCShader x, SCShader y) => { return(y.keywordEnabledCount.CompareTo(x.keywordEnabledCount)); }); break; case SortType.ShaderFileName: shaders.Sort((SCShader x, SCShader y) => { return(x.name.CompareTo(y.name)); }); break; } UpdateProjectStats(); } catch (Exception ex) { Debug.LogError("Unexpected exception caught while scanning project: " + ex.Message); } }