Unity 6.3
0 онлайн 85 гостей 3 в системе
Вход

Переключить ключевые слова шейдера в редакторе

Чтобы переключить ключевые слова в редакторе, добавьте свойство материала для ключевого слова. Это позволит вам установить различные состояния ключевых слов для различных материалов без использования кода.

Выполните следующие действия:

  1. Добавьте _ON в конце ключевого слова, которое вы объявляете. Например, измените _RED на _RED_ON. Убедитесь, что вы обновили свой код ветвления, чтобы использовать новое имя.

  2. Убедитесь, что вы или Unity объявляете состояние, когда ключевое слово выключено. Подробнее см. Ветвь, когда все ключевые слова в наборе отключены.

    Например, если вы используете shader_feature чтобы объявить только одно ключевое слово, Unity автоматически создаёт состояние 'off'.

  3. Добавить целое число свойство материала с атрибутом [Toggle]и имя ключевого слова без _ON. Например:

        Properties
        {
            [Toggle] _RED ("Make red", Integer) = 0
        }
    

Теперь, когда вы создаете материал, использующий шейдер, окно Inspector материала имеет флажок, который включает или отключает ключевое слово.

Чтобы отключить свойство по умолчанию, используйте [ToggleOff] вместо [Toggle].

Переключить наборы ключевых слов

Чтобы переключить ключевые слова в наборе так, чтобы они были взаимоисключающими, добавьте свойство с атрибутом KeywordEnum. Unity создает раскрывающийся список со всеми ключевыми словами. Когда вы включаете одно ключевое слово в наборе, Unity отключает другие.

Выполните следующие действия:

  1. Объявите ключевое слово в формате SETNAME_KEYWORDNAME. Например:

    #pragma shader_feature _COLOR_RED _COLOR_GREEN _COLOR_BLUE
    
  2. Добавьте свойство материала с атрибутом [KeywordEnum] и именем набора ключевых слов. Передайте имена ключевых слов. Например:

    Properties
    {
        [KeywordEnum(RED, GREEN, BLUE)] _COLOR ("Color", Integer) = 0
    }
    

Для получения дополнительной информации и примеров см. MaterialPropertyDrawer API.

Пример

В следующем примере добавлено свойство _RED, которое включает и отключает ключевое слово _RED_ON.

Shader "Unlit/ToggleRed"
{
    Properties
    {
        [Toggle] _RED ("Make red", Integer) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            // Add the keyword RED_ON, for when the toggle is on
            // Unity automatically adds a keyword for when the toggle is off 
            #pragma shader_feature _RED_ON

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // Return red if the toggle is on
                #if _RED_ON
                    return fixed4(1, 0, 0, 1);
                #else
                    return fixed4(0, 0, 0, 1);
                #endif
            }
            ENDHLSL
        }
    }
}

Дополнительные ресурсы