Я написал собственный сценарий редактора для своего класса, чтобы установить цвета для материала при изменении любого из значений цвета, поэтому я могу предварительно просмотреть цвета на ходу.
Сценарий работает очень хорошо, но когда я сохраняю сцену, происходит что-то странное. Все цвета меняются на странные значения по умолчанию и остаются такими до тех пор, пока я не нажму на сам объект, а затем он будет обновлен до правильных цветов, которые я выбрал ранее.
Вот как выглядит спрайт перед сохранением сцены:
![Sprite before I save the scene](https://i.stack.imgur.com/Bl6KJ.png)
А вот как это выглядит после сохранения сцены:
![Sprite after I save the scene](https://i.stack.imgur.com/BeJZc.png)
Как я уже говорил, после нажатия на 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
.
Кто-нибудь знает, как заставить цвета сохраняться внутри шейдера?