private var obj:GameObject; private var render:Renderer; public var texture:Texture; function Start () { obj = GameObject.Find("Cube"); // obj.AddComponent.<Test>(); render = obj.GetComponent.<Renderer>(); } function OnGUI() { if(GUILayout.Button("add color",GUILayout.Width(100),GUILayout.Height(50))) { render.material.color = Color.blue; <span style="color:#ff0000;">render.material.mainTexture = null;</span> } if(GUILayout.Button("add texture",GUILayout.Width(100),GUILayout.Height(50))) { render.material = null; <span style="color:#6600cc;">render.material.mainTexture = texture;</span> } } function Update () { }
以上代码就是为了点击按钮“add color”将Cube的颜色变成blue;点击“add texture”,将Cube贴图。
原图:
改变颜色后:
改变纹理后
关键在于红色与紫色那句。
红色那句好理解,因为如果去掉清除纹理这一句,纹理就会残留,就达不到将图像改变成纯色蓝色的效果,去掉这句之后,如果先添加纹理,再添加颜色,效果如下图:
看,是不是设置了颜色,纹理还在,我认为这种混合效果就是只保留了蓝色分量的效果。
紫色那句我当时看了很纳闷,这不是病句么,先把render的material设置为了null,然后又去设置render的material的属性,这不是肯定会空引用异常么。结果没有出现错误。于是我去掉了这一句,于是出现了和上图一样的效果,这就说明,是Color没有清除掉,通过打断点得知,紫色这句执行后,material不为空,不过material的属性color变成了(1,1,1,1),也就是Color.white.于是我认为
紫色这句:render.material = null;可以替换成:render.material.color = Color.white;这样达到了一样的效果,思考,为什么呢?
原因就是由于r/g/b分量都是255,r/g/b通道颜色值都得到了保留也就是纹理的本来效果了。