本页面包含有关在您的 ShaderLab 代码中使用 CustomEditor 或 CustomEditorForRenderPipeline 块来指定自定义编辑器 的信息。
使用自定义编辑器可显示 Unity 无法使用其默认材质 Inspector 显示的数据类型,或定义自定义控件或数据验证。
| 功能名称 | 内置渲染管线 | 通用渲染管线 (URP) | 高清渲染管线 (HDRP) | 自定义 SRP | 
|---|---|---|---|---|
| ShaderLab: CustomEditor block | 是 | 是 | 是 | 是 | 
| ShaderLab: CustomEditorForRenderPipeline block | 否 | 是 | 是 | 是 | 
在 ShaderLab 中,您可以为所有渲染管线指定一个自定义编辑器。为此,您可以在 Shader 代码块中放置一个 CustomEditor 代码块。您还可以为基于可编程渲染管线的渲染管线指定不同的自定义编辑器,方法是在 Shader 代码块中放置一个 CustomEditorForRenderPipeline 代码块。如果您的代码同时包含 CustomEditor 和 CustomEditorForRenderPipeline 块,则特定于渲染管线的块会覆盖 CustomEditor 块。
| 签名 | 功能 | 
|---|---|
| CustomEditor “[custom editor class name]” | Unity 使用在命名类中定义的自定义编辑器,除非它被 CustomEditorForRenderPipeline 代码块覆盖。 | 
| CustomEditorForRenderPipeline “[custom editor class name]” “[render pipeline asset class name]” | 当活动渲染管线资源是命名类型时,Unity 使用该命名类中定义的自定义编辑器。 | 
要为代表给定 Shader 对象的着色器资源定义一个自定义编辑器,您需要创建一个继承自 ShaderGUI 类的脚本。请在您的 Assets 文件夹下,将您的脚本放在名为 Editor 的文件夹中。
脚本应遵循以下格式:
using UnityEditor;
public class ExampleShaderGUI : ShaderGUI 
{
    public override void OnGUI (MaterialEditor materialEditor, MaterialProperty[] properties)
    {
        // 此处是控制 Inspector 外观的自定义代码
        base.OnGUI (materialEditor, properties);
    }
}
此示例代码演示了使用 CustomEditor 块和 CustomEditorForRenderPipeline 块的语法,前者为着色器资源指定默认自定义编辑器,后者为特定渲染管线资源指定两个额外自定义编辑器。
Shader "Examples/UsesCustomEditor"
{
    // Unity 编辑器使用 ExampleCustomEditor 类为此着色器资源配置
    CustomEditor "ExampleShaderGUI"
    CustomEditorForRenderPipeline "ExampleRenderPipelineShaderGUI" "ExampleRenderPipelineAsset"
    CustomEditorForRenderPipeline "OtherExampleRenderPipelineShaderGUI" "OtherExampleRenderPipelineAsset"
    SubShader
    {
        // 此处是定义子着色器的代码。
        Pass
        {                
              // 此处是定义子通道的代码。
        }
    }
}