我为一个我的类编写了一个自定义编辑器脚本,以便在任何颜色值发生更改时将颜色设置为一种材料,这使我可以随时随地预览颜色。
脚本运行得很好,但是当我保存场景时,发生了一些奇怪的事情。所有颜色都会更改为一些奇怪的默认值,并保持这种状态,直到我单击对象本身,然后颜色才会更新为我之前选择的正确颜色。
这是在保存场景之前精灵的外观:
这是保存场景后的样子:
正如我所提到的,在单击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
的属性。
有人知道如何使颜色保持在着色器中吗?
答案 0 :(得分:0)
将SetColorMatrix();
从编辑器中的OnInspectorGUI()
移动到脚本中的OnValidate()
。
public class ColorMatrixPicker : MonoBehavior {
private void OnValidate() {
SetColorMatrix();
}
}
如果这不起作用,请在类声明之前添加[ExecuteInEditMode]
,并将SetColorMatrix()
添加到Start()
。