Unity 中的 Shader 有四种渲染模式,分别是:html
——Opaque(不透明) ——Cutout(镂空) ——Fade(隐现) ——Transparent(透明)
以前我遇到一个需求,须要给特定的游戏物体添加一个冰冻的效果,可是给个人 Shader
是一个彻底冰冻的 Shader,并且没法经过参数调整它的颜色值。以后个人同事告诉我可
以经过修改渲染模式更改物体自己的Alpha值实现,因此第一步我寻找了网上关于修改运
行时 Shader 渲染模式的代码,以下。
http://www.voidcn.com/article...数组
而后就是简单的代码操做,以下。函数
//获取目标身上的渲染组件 var renderer = GetComponentsInChildren<Renderer>(); // 创建一个冰冻数组 第二个数组元素是事先找好的冰冻特效 Material[] frostMatetials = new Material[2] { renderer.material, frostEffect }; //添加冰冻特效到人物身上的数组中 renderer.materials = frostMatetials; //实例化一个渲染模式变量 var fadeMode = SetMaterialRenderingMode.RenderingMode.Fade; //根据网上的方法更改你的 Shader 渲染模式为 Fade SetMaterialRenderingMode.SetMaterialRenderingModeMethod( renderer.materials[0],fadeMode);
因为 Color 的 Alpha 值是只读的不能修改,可是 Color 是能够修改的,因此要获取目标
物体 Color 的 RGB 值,而后实例一个 Color 用构造函数更改成你想要的 Alpha 值。以下:spa
Color currentcolor03 = new Color { a = 0.8f, r = renderer.materials[0].color.r, g = renderer.materials[0].color.g, b = renderer.materials[0].color.b }; //替换目标 Color 属性就能够实现了
其实这个方法不是很好,主要是由于所给的 Shader 不能修改属性值,后来我拿到了能够更改
属性值的Shader,事情就变得简单了许多。code
这是我拿到的材料,能够经过材料找到材料中包含的 Shader,里面能够看到每一个值所对应的参数。htm
这样的话修改就只须要经过调用方法 Material.SetFloat(); 及其相似方法,括号里面是两个
参数一个是 String 类型的参数,表示经过 String 获取想要改变的参数,第二个是更改的值。游戏
这期间我遇到一个问题,最后找了好久发现是编译器的问题,我在用第一种方法的时候,若是正常
状况下能够修改渲染模式,而且我用了三个 Color 来依次替换实现了渐变效果,可是若是我在
Hierarchy 面板中选中这个物体那么正在改变的物体就会忽然变回更改以前的默认状态,或者如
果你预先选中了这个将要更改的物体他也会出现一样的效果,就是不能在编译状态下选中这个游
戏物体,不能在 Inspector 面板中查看他的渲染状态,最后我得出了一个运行时渲染的词语来
描述这个行为,
若是你在运行时更改了游戏物体 Shader 的渲染模式,那么查看他的渲染模式会致使他的渲染模
式属性重置。图片