下面这段代码效果是给有_Gradient属性的材质添加渐变纹理,有点小bug折腾了两天也没结果,希望大家帮忙康康了
,感谢了
问题描述:每次编译或者重启编辑器时shader里的_Gradient("Gradient",2D) = "black"{}这个贴图会丢失,但是脚本里创建的贴图文件还在,且可以正常被修改,而丢失后再次点击材质贴图又会回来
using System.IO;
using Unity.Plastic.Newtonsoft.Json;
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(Material))]
public class GradientEditor : MaterialEditor
{
private string PropertiesGradient = "_Gradient";
private Material material;
private Gradient ColorGradient;
private int Precisione = 512;
public override void OnEnable()
{
base.OnEnable();
material = null;
ColorGradient = null;
material = target as Material;
if (material == null) return;
if (!material.HasProperty(PropertiesGradient)) return;
GradientExists();
}
public override void OnInspectorGUI()
{
if (material == null || !material.HasProperty(PropertiesGradient))
{
base.OnInspectorGUI();
return;
}
if (material == null) return;
if (material.HasProperty(PropertiesGradient))
{
ColorGradient = EditorGUILayout.GradientField("Gradient", ColorGradient);
Precisione = EditorGUILayout.IntField("Precisione", Precisione);
Precisione = Mathf.Clamp(Precisione, 18, 1024);
GradientExists();
}
base.OnInspectorGUI();
}
void GradientExists()
{
string directoryPath = Path.Combine(Application.dataPath, "Gradient");
if (!Directory.Exists(directoryPath))
{
Directory.CreateDirectory(directoryPath);
AssetDatabase.Refresh();
}
string filePath = Path.Combine(directoryPath, material.name + "_Gradient.png");
if (ColorGradient == null)
{
ColorGradient = new Gradient();
if (File.Exists(filePath))
{
Texture2D texture2D = new Texture2D(1024, 2);
texture2D.LoadImage(File.ReadAllBytes(filePath));
GetGradient(texture2D);
}
}
else
{
Texture2D tex = GetGradientColor2D();
byte[] bytes = tex.EncodeToPNG();
using (FileStream fileStream = new FileStream(filePath, FileMode.Create))
{
fileStream.Write(bytes, 0, bytes.Length);
fileStream.Close();
}
tex.LoadImage(File.ReadAllBytes(filePath));
material.SetTexture(PropertiesGradient, tex);
}
}
void GetGradient(Texture2D texture)
{
GradientColorKey[] colorKeys = new GradientColorKey[(int)(texture.GetPixel(0, 2).r * 8)];
GradientAlphaKey[] alphaKeys = new GradientAlphaKey[(int)(texture.GetPixel(0, 2).g * 8)];
for (int i = 0; i < 8; i++)
{
if(i < colorKeys.Length)
{
colorKeys[i].color = texture.GetPixel(i + 1, 2);
colorKeys[i].time = texture.GetPixel(i + 1, 2).a;
}
if(i < alphaKeys.Length)
{
alphaKeys[i].alpha = texture.GetPixel(i + 9, 2).g;
alphaKeys[i].time = texture.GetPixel(i + 9, 2).a;
}
}
ColorGradient.SetKeys(colorKeys, alphaKeys);
Precisione = (int)(texture.GetPixel(0, 2).b * 1024f);
}
Texture2D GetGradientColor2D()
{
Texture2D gradientColor2D = new Texture2D(Precisione, 2);
Color[] newcolor = new Color[18];
GradientColorKey[] colorKeys = ColorGradient.colorKeys;
GradientAlphaKey[] alphaKeys = ColorGradient.alphaKeys;
newcolor[0].r = colorKeys.Length / 8f;
newcolor[0].g = alphaKeys.Length / 8f;
newcolor[0].b = Precisione / 1024f;
for (int i = 1; i < 9; i++)
{
if (i - 1 >= (int)(newcolor[0].r * 8)) break;
newcolor[i] = colorKeys[i - 1].color;
newcolor[i].a = colorKeys[i - 1].time;
}
for (int i = 9; i < 17; i++)
{
if (i - 9 >= (int)(newcolor[0].g * 8)) break;
newcolor[i].g = alphaKeys[i - 9].alpha;
newcolor[i].a = alphaKeys[i - 9].time;
}
for (int i = 0; i < 17; i++)
{
gradientColor2D.SetPixel(i, 2, newcolor[i]);
}
for (int i = 0; i < gradientColor2D.width; i++)
{
gradientColor2D.SetPixel(i, 1, ColorGradient.Evaluate(i / (float)(gradientColor2D.width - 1f)));
}
return gradientColor2D;
}
}
目前推测出问题的地方是GradientExists()的else分支,但不知道怎么改,查找资料也没找到方法,感觉大家帮忙了awa