Странное поведение шейдера при сохранении сцены - PullRequest
0 голосов
/ 04 ноября 2018

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

Сценарий работает очень хорошо, но когда я сохраняю сцену, происходит что-то странное. Все цвета меняются на странные значения по умолчанию и остаются такими до тех пор, пока я не нажму на сам объект, а затем он будет обновлен до правильных цветов, которые я выбрал ранее.

Вот как выглядит спрайт перед сохранением сцены:

Sprite before I save the scene

А вот как это выглядит после сохранения сцены:

Sprite after I save the scene

Как я уже говорил, после нажатия на GameObject спрайт обновляется до ранее сохраненных цветов.

Вот код для пользовательского сценария редактора:

public class PaletteEditor : Editor
{
    SerializedProperty Col1,
        Col2,
        Col3,
        Col4;

    public void OnEnable()
    {
        Col1 = serializedObject.FindProperty("Col1");
        Col2 = serializedObject.FindProperty("Col2");
        Col3 = serializedObject.FindProperty("Col3");
        Col4 = serializedObject.FindProperty("Col4");
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        Col1.colorValue = EditorGUILayout.ColorField("Col1", Col1.colorValue);
        Col2.colorValue = EditorGUILayout.ColorField("Col2", Col2.colorValue);
        Col3.colorValue = EditorGUILayout.ColorField("Col3", Col3.colorValue);
        Col4.colorValue = EditorGUILayout.ColorField("Col4", Col4.colorValue);

        ((ColorMatrixPicker)target).SetColorMatrix();
        serializedObject.ApplyModifiedProperties();
    }
}

EDIT:

Я пробовал решение SonicBlue22, но проблема все еще сохраняется. Я возился со сценарием и думаю, что проблема может быть в самом шейдере, поскольку он не сохраняет значения, назначенные ему сценарием.

Вот код шейдера:

Shader "Custom/PaletteSwap" {
Properties{
    _Color("Color", Color) = (1,1,1,1)
    [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
    _Cutoff("Shadow alpha cutoff", Range(0,1)) = 0.5
    _BumpTex("Bump map", 2D) = "bump" {}
}
SubShader
{
    Tags
    {
        "Queue" = "Geometry"
        "RenderType" = "TransparentCutout"
    }

    Cull Off

    CGPROGRAM
    #pragma surface surf Lambert addshadow fullforwardshadows
    #pragma target 3.0

    sampler2D _MainTex;
    sampler2D _BumpTex;
    fixed4 _Color;
    fixed _Cutoff;
    half4x4 _ColorMatrix;

    struct Input
    {
        float2 uv_MainTex;
    };

    void surf(Input IN, inout SurfaceOutput o) {
        fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
        o.Normal = UnpackNormal(tex2D(_BumpTex, IN.uv_MainTex));
        o.Albedo = _ColorMatrix[c.r * 3];
        o.Alpha = c.a;
        clip(o.Alpha - _Cutoff);
    }
    ENDCG
}
FallBack "Diffuse"

}

Я присваиваю значения цвета прямо матрице следующим образом:

Mat.SetMatrix("_ColorMatrix", ColorMatrix);

Где ColorMatrix - это свойство, которое генерирует Matrix4x4.

Кто-нибудь знает, как заставить цвета сохраняться внутри шейдера?

1 Ответ

0 голосов
/ 05 ноября 2018

Переместите SetColorMatrix(); из OnInspectorGUI() в редакторе в OnValidate() в скрипте.

public class ColorMatrixPicker : MonoBehavior {
    private void OnValidate() {
        SetColorMatrix();
    }
}

Если это не сработает, добавьте [ExecuteInEditMode] перед объявлением класса, а также добавьте SetColorMatrix() к Start().

...