# ShaderGUI

> Abstract class to derive from for defining custom GUI for shader properties and for extending the material preview.

## Definition

* **Type:** Class
* **Namespace:** [UnityEditor](/engine/6000.7/script-reference/unityeditor.md)
* **Assembly:** UnityEditor.CoreModule

```csharp
public abstract class ShaderGUI
```

## Remarks

Derive from this class for controlling how shader properties should be presented. For a shader to use this custom GUI use the 'CustomEditor' property in the shader. Note that CustomEditor can also be used for classes deriving from MaterialEditor (search for: Custom Material Editors). See [ShaderGUI.OnGUI](/engine/6000.7/script-reference/unityeditor/shadergui/ongui.md), [ShaderGUI.OnMaterialPreviewGUI](/engine/6000.7/script-reference/unityeditor/shadergui/onmaterialpreviewgui.md), [ShaderGUI.OnMaterialPreviewSettingsGUI](/engine/6000.7/script-reference/unityeditor/shadergui/onmaterialpreviewsettingsgui.md).

## Examples

```csharp
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.Linq;

public class CustomShaderGUI : ShaderGUI
{
    override public void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
    {
        // render the shader properties using the default GUI
        base.OnGUI(materialEditor, properties);

        // get the current keywords from the material
        Material targetMat = materialEditor.target as Material;
        string[] keyWords = targetMat.shaderKeywords;

        // see if redify is set, then show a checkbox
        bool redify = keyWords.Contains("REDIFY_ON");
        EditorGUI.BeginChangeCheck();
        redify = EditorGUILayout.Toggle("Redify material", redify);
        if (EditorGUI.EndChangeCheck())
        {
            // if the checkbox is changed, reset the shader keywords
            var keywords = new List<string> { redify ? "REDIFY_ON" : "REDIFY_OFF" };
            targetMat.shaderKeywords = keywords.ToArray();
            EditorUtility.SetDirty(targetMat);
        }
    }
}
```

## Methods

| Method                                                                                                                | Description                                                                                                                                                    |
| --------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [AssignNewShaderToMaterial](/engine/6000.7/script-reference/unityeditor/shadergui/assignnewshadertomaterial.md)       | This method is called when a new shader has been selected for a Material.                                                                                      |
| [OnClosed](/engine/6000.7/script-reference/unityeditor/shadergui/onclosed.md)                                         | This method is called when the ShaderGUI is being closed.                                                                                                      |
| [OnGUI](/engine/6000.7/script-reference/unityeditor/shadergui/ongui.md)                                               | To define a custom shader GUI use the methods of **materialEditor** to render controls for the **properties** array.                                           |
| [OnMaterialPreviewGUI](/engine/6000.7/script-reference/unityeditor/shadergui/onmaterialpreviewgui.md)                 | Override for extending the rendering of the Preview area or completly replace the preview (by not calling base.OnMaterialPreviewGUI).                          |
| [OnMaterialPreviewSettingsGUI](/engine/6000.7/script-reference/unityeditor/shadergui/onmaterialpreviewsettingsgui.md) | Override for extending the functionality of the toolbar of the preview area or completly replace the toolbar by not calling base.OnMaterialPreviewSettingsGUI. |
| [ValidateMaterial](/engine/6000.7/script-reference/unityeditor/shadergui/validatematerial.md)                         | When the user loads a Material using this ShaderGUI into memory or changes a value in the Inspector, the Editor calls this method.                             |

## Static Methods

| Method                                                                                | Description             |
| ------------------------------------------------------------------------------------- | ----------------------- |
| [FindProperty](/engine/6000.7/script-reference/unityeditor/shadergui/findproperty.md) | Find shader properties. |
