public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        if (GUILayout.Button("Write variant collection"))
        {
            ShaderVariantWriter settings = target as ShaderVariantWriter;
            settings.Write();
            AssetDatabase.SaveAssets();
        }
    }
    void Write()
    {
        file = new StreamWriter("ShaderSources.txt");
        ShaderVariantWriter settings = target as ShaderVariantWriter;

        Debug.Assert(settings.output != null);
        ShaderVariantCollection collection = settings.output;

        collection.Clear();
        shaders         = new Dictionary <Shader, List <string> >();
        exclude         = new HashSet <Renderer>();
        seenObjects     = new HashSet <GameObject>();
        internalShaders = new HashSet <string>(new string[] {
            "Hidden/InternalErrorShader",
            "Hidden/VideoDecodeAndroid",
            "GUI/Text Shader"
        });
        shaderKeywords = new Dictionary <Shader, List <HashSet <string> > >();
        foreach (string shaderName in settings.additionalHiddenShaders)
        {
            Shader shader = Shader.Find(shaderName);
            if (shader == null)
            {
                Debug.LogErrorFormat(
                    "Could not find shader '{0}'",
                    shaderName);
            }
            else
            {
                AddShader(shader, "additional hidden shaders");
            }
        }
        foreach (Shader shader in settings.additionalShaders)
        {
            AddShader(shader, "additional shaders");
        }
        foreach (Material material in settings.additionalMaterials)
        {
            AddMaterial(material, "additional materials");
        }
        foreach (GameObject prefab in settings.additionalPrefabs)
        {
            AddObjectShaders(prefab, "additional prefabs");
        }
        if (settings.scene != null)
        {
            Scene scene =
                EditorSceneManager.OpenScene(
                    AssetDatabase.GetAssetPath(
                        settings.scene));

            if (scene.IsValid())
            {
                foreach (GameObject root in scene.GetRootGameObjects())
                {
                    AddMeshBakeRenderersToExclusionList(root);
                }
                foreach (GameObject root in scene.GetRootGameObjects())
                {
                    AddObjectShaders(root, "scene object");
                }
            }
        }
        foreach (var entry in shaders)
        {
            foreach (Variant wantedVariant in settings.wantedVariants)
            {
                AddVariations(collection, entry.Key, wantedVariant, entry.Value);
            }
        }
        file.Close();
        file = null;
    }