HDRP版本是7.3.1 (升级到7.4.1也是一样的)
Unity版本是2019.3.8f
问题是我通过替换Shader的方式改变材质的效果(改成高亮或者透明),然后还原,在Editor中正常的,但是在打包后运行时还原回来材质变成了黑色。是那种纯黑色,没有贴图的,怀疑在切换Shader过程中,原来的Shader的设置丢失了。
修改材质的Shader时有用ShaderMaterial就没问题,用Material就有问题。
我的需求时点击一物体,该物体变成高亮颜色,其他物体全部透明。
因为其他物体数量很多,几万个,如果用修改其他物体的材质的方式,而不是修改SharedMaterial的Shader方式,需要几秒的实际。
一、设置高亮
1.设置高亮_Material_Shader
for (int i = 0; i < meshRender.materials.Length; i++)
{
meshRender.materials[i].shader = NodeHighlightSystem.Instance.Hightlight_Shader;
}
2.设置高亮_SharedMaterial_Shader
for (int i = 0; i < meshRender.sharedMaterials.Length; i++)
{
meshRender.sharedMaterials[i].shader = sys.Hightlight_Shader;
}
3.设置高亮_Material
Material[] materialsNew = meshRender.materials;
for (int i = 0; i < meshRender.materials.Length; i++)
{
materialsNew[i] = NodeHighlightSystem.Instance.Highlight_Mat;
}
meshRender.materials = materialsNew;
二、还原高亮
1.还原_Material_Shader,Shaders事先保存下来
for (int i = 0; i < meshRender.materials.Length; i++)
{
meshRender.materials[i].shader = shaders[i];
}
2.还原_SharedMaterial_Shader,Shaders事先保存下来
for (int i = 0; i < meshRender.materials.Length; i++)
{
meshRender.sharedMaterials[i].shader = shaders[i];
}
3.还原_Materials,Materials事先保存下来
meshRender.materials = materials;
三、全部透明和还原
1.设置透明_SharedMaterial_Shader,allSharedMaterials提前获取
if (allSharedMaterials.Count == 0)
{
GetAllSharedMaterials();
}
for (int i = 0; i < allSharedMaterials.Count; i++)
{
Material item = allSharedMaterials[i];
if (item.shader!= Transparent_Shader)
{
//item.shader = allSharedShaders[i];
item.shader = Transparent_Shader;
}
}
2.透明恢复_SharedMaterial_Shader,allSharedShaders提前获取
for (int i = 0; i < allSharedMaterials.Count; i++)
{
Material item = allSharedMaterials[i];
item.shader = allSharedShaders[i];
}
-------------------------------------------------------------------------------------------
四、组合测试
组合1:1.设置高亮_Material_Shader+1.还原_Material_Shader+透明其他
会变黑
最后会黑成这样
组合2:1.设置高亮_Material_Shader+2.还原_SharedMaterial_Shader+透明其他
会变黑
组合3:1.设置高亮_Material_Shader+2.还原_Materials+透明其他
不会变黑
组合4:2.设置高亮_SharedMaterial_Shader+2.还原_Material_Shader+透明其他
不会变黑
因为修改的是SharedMaterial的Shader,点击的物体共用材质的其他物体也会高亮。
还原回去再点击就是独立高亮了。
组合5:2.设置高亮_SharedMaterial_Shader+2.还原_SharedMaterial_Shader+透明其他
不会变黑
和上面情况类似,但是,我理解这里还原也是SharedMaterial的,应该后面也都是
组合6:3.设置高亮_SharedMaterial_Shader+3.还原_Materials+透明其他
不会变黑,而且Materials还原回去后,再点击,相关的物体也一起高亮,奇怪,和上面的情况
不管怎样,高亮都是不能使用修改SharedMaterial的Shader的方式的。
组合7:3.设置高亮_Materials+3.还原_Material_Shader+透明其他
变白了...
修改了材质后,修改材质的Shader,其实就没有还原回去了,最后相当于是把高亮材质再改了个Shader。
组合8:3.设置高亮_Materials+3.还原_SharedMaterial_Shader+透明其他
和上面一样,变白了
组合9:3.设置高亮_Materials+3.还原_Materials+透明其他
没问题,可以
三、最终的解决办法