NGUI中使UITexture变灰的方法

作者: koo叔 分类: Unity3D 发布时间: 2018-03-09 23:43 编辑

前言

在开发中经常会遇到图片变灰的情况。如下图这样:
image
变亮的表示可用,变灰的表示不可用。一般这种情况的解决方案就是写一个变灰的Shader。但如果是NGUI的UITexture变灰会比较麻烦一些。那遇到这种需求要如何做呢?

方案

1.首先新建一个变灰的Shader,文件名起为 ==“Unlit - Transparent Colored (Gray).shader”==:
这里只展示部分关键代码,后面会有完整代码下载

fixed4 frag (v2f IN) : COLOR
{
    fixed4 realColor = tex2D(_MainTex, IN.texcoord) * IN.color;
    float grayValue = realColor.r * 0.3 + realColor.g * 0.3 + realColor.b * 0.4;
    return fixed4(grayValue, grayValue, grayValue, realColor.a);
}

重点是这句:

float grayValue = realColor.r * 0.3 + realColor.g * 0.3 + realColor.b * 0.4;

变灰实际上就是给RGB每个分量乘一个差不多的系数,这里我们取0.3
写完后将这个Shader存在和"Unlit - Transparent Colored.shader"的同级目录下

2.建一个静态类,类里分别是变灰和变正常的方法:

public static class UITextureStatic{
    public static void ToGray(this UITexture tex,bool isClip){
        if(isClip){
            tex.onRender = (mat)=>{
                if(mat.HasProperty ("_isGray")) {
                    mat.SetInt ("_isGray",0);
                }
            };
        }else{
            tex.shader = Shader.Find ("Unlit/Transparent Colored (Gray)");
        }
    }

    public static void ToNormal(this UITexture tex,bool isClip){
        if(isClip){
            tex.onRender = (mat)=>{
                if(mat.HasProperty ("_isGray")) {
                    mat.SetInt ("_isGray",1);
                }
            };
        }else{
            tex.shader = Shader.Find ("Unlit/Transparent Colored");
        }
    }
}

Clip为Ture的情况是处理当UITexture在设置了ClipRange的UIPanel下时的处理方法
Clip为false的情况是一般显示UITexture的地方的处理方法

3.使用

public class Demo:MonoBehaviour{
    public UITexture tex;
    public void SetTexture(bool isGray,bool isClip){
        if(isGray){
            this.tex.ToGray(isClip);
        }else{
            this.tex.ToNormal(isClip);
        }
    }
}

代码获得:

完整代码见[这里](链接: https://pan.baidu.com/s/1CxZ2HlturAd0BKCTUvVJRw 密码: cyrj

总结

这个就是我的UITexture变灰的处理方案,如果有更好的方案欢迎讨论

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

你的email不会被公开。必填项已用*标注

更多阅读
标签云