Version: 2021.3
言語: 日本語
ShaderLab: フォールバックの割り当て
ShaderLab: SubShader の定義

ShaderLab: カスタムエディターの割り当て

このページには、ShaderLab コードの CustomEditor または CustomEditorForRenderPipeline ブロックを使用して、カスタムエディター を割り当てるための情報が記載されています。

カスタムエディターを使用して、Unity のデフォルトのマテリアルインスペクターでは表示できないデータタイプを表示したり、カスタムコントロールやデータ検証を定義します。

レンダーパイプラインの互換性

機能名 ビルトインレンダーパイプライン ユニバーサルレンダーパイプライン (URP) HD レンダーパイプライン (HDRP) カスタム SRP
ShaderLab: CustomEditor ブロック あり あり あり あり
ShaderLab: CustomEditorForRenderPipeline ブロック なし あり あり あり

CustomEditor および CustomEditorForRenderPipeline ブロックの使用

ShaderLab では、すべてのレンダーパイプラインにカスタムエディターを割り当てることができます。これを行うには、CustomEditor ブロックを Shader ブロック内に配置します。また、 CustomEditorForRenderPipeline ブロックを Shader ブロックの中に配置することで、スクリプタブルレンダーパイプラインに基づいてレンダーパイプラインに様々なカスタムエディターを割り当てることができます。コードに CustomEditorCustomEditorForRenderPipeline の両方のブロックが含まれている場合は、レンダーパイプラインに特有のものが 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 を定義するコードをここに記述
        }
    }
}
ShaderLab: フォールバックの割り当て
ShaderLab: SubShader の定義