Странное поведение шейдера при сохранении сцены
Я написал собственный сценарий редактора для своего класса, чтобы установить цвета для материала при изменении любого из значений цвета. Это дает мне возможность предварительно просматривать цвета на ходу.
Сценарий работает очень хорошо, но когда я сохраняю сцену, происходит что-то странное. Все цвета меняются на странные значения по умолчанию и остаются такими, пока я не нажму на сам объект, а затем он будет обновлен до правильных цветов, которые я выбрал ранее.
Вот как выглядит спрайт перед тем, как сохранить сцену:
И вот как это выглядит после сохранения сцены:
Как я уже упоминал, после нажатия на 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()
,