Странное поведение шейдера при сохранении сцены

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

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

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

Спрайт, прежде чем я спасу сцену

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

Спрайт после того, как я спасу сцену

Как я уже упоминал, после нажатия на 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();
    }
}

РЕДАКТИРОВАТЬ:

Я пробовал решение 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 ответ

Переехать SetColorMatrix(); от OnInspectorGUI() в редакторе OnValidate() в сценарии.

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

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

Другие вопросы по тегам