このページには、ShaderLab コードの CustomEditor または CustomEditorForRenderPipeline ブロックを使用して、カスタムエディター を割り当てるための情報が記載されています。
カスタムエディターを使用して、Unity のデフォルトのマテリアルインスペクターでは表示できないデータタイプを表示したり、カスタムコントロールやデータ検証を定義します。
| 機能名 | ビルトインレンダーパイプライン | ユニバーサルレンダーパイプライン (URP) | HD レンダーパイプライン (HDRP) | カスタム SRP | 
|---|---|---|---|---|
| ShaderLab: CustomEditor ブロック | 可 | 可 | 可 | 可 | 
| ShaderLab: CustomEditorForRenderPipeline ブロック | なし | 可 | 可 | 可 | 
ShaderLab では、すべてのレンダーパイプラインにカスタムエディターを割り当てることができます。これを行うには、CustomEditor ブロックを Shader ブロック内に配置します。また、 CustomEditorForRenderPipeline ブロックを Shader ブロックの中に配置することで、スクリプタブルレンダーパイプラインに基づいてレンダーパイプラインに様々なカスタムエディターを割り当てることができます。コードに CustomEditor と CustomEditorForRenderPipeline の両方のブロックが含まれている場合は、レンダーパイプラインに特有のものが CustomEditor のものをオーバーライドします。
| シグネチャ | 機能 | 
|---|---|
| CustomEditor “[カスタムエディターのクラス名]” | Unity は、 CustomEditorForRenderPipelineブロックによってオーバーライドされない限り、名前付きクラスで定義されたカスタムエディターを使用します。 | 
| CustomEditorForRenderPipeline “[カスタムエディターのクラス名]” “[レンダーパイプラインアセットのクラス名]” | アクティブなレンダーパイプラインのアセットが名前付きタイプの場合、Unity は名前付きクラスで定義されたカスタムエディターを使用します。 | 
任意のシェーダーオブジェクトを表すシェーダーアセットのためにカスタムエディターを定義するには、ShaderGUI クラスを継承したスクリプトを作成します。このスクリプトは、 Assets フォルダー内の Editor という名前のフォルダーに置きます。
スクリプトは以下のような形式にします。
using UnityEditor;
public class ExampleShaderGUI : ShaderGUI 
{
    public override void OnGUI (MaterialEditor materialEditor, MaterialProperty[] properties)
    {
        //  Inspector の表示を制御するカスタムコードをここに記述
        base.OnGUI (materialEditor, properties);
    }
}
このサンプルコードは CustomEditor ブロックを使用して、シェーダーアセット用にデフォルトのカスタムエディターを指定してから、CustomEditorForRenderPipeline ブロックを使用して、特定のレンダーパイプラインアセット用に 2 つの追加カスタムエディターを指定する構文を示しています。
Shader "Examples/UsesCustomEditor"
{
    // Unity エディターは ExampleCustomEditor クラスを使って、このシェーダーアセットの Inspector を設定します
    CustomEditor "ExampleShaderGUI"
    CustomEditorForRenderPipeline "ExampleRenderPipelineShaderGUI" "ExampleRenderPipelineAsset"
    CustomEditorForRenderPipeline "OtherExampleRenderPipelineShaderGUI" "OtherExampleRenderPipelineAsset"
    SubShader
    {
        //SubShader を定義するコードをここに記述
        Pass
        {                
              // Pass を定義するコードをここに記述
        }
    }
}