UGUI序列帧

Posted 那个妹子留步

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UGUI序列帧相关的知识,希望对你有一定的参考价值。

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Yly/YlyUISeqFrameAni"

    // if( (referenceValue & maskValue) comparisonFunction (stencilBufferValue & maskValue) )
    //     通过测试,保留像素
    // 
    // else
    //     丢弃像素
    // 
    //按位与&

    //Stencil Comparison 总共九种
    //0 DIsable       模板测试 或者 深度测试不可用时  
    //1 Never         模板测试 或者 深度测试  永远不通过时
    //2 Less          模板测试 或者 深度测试  小于  则通过
    //3 Equal         模板测试 或者 深度测试  等于  则通过
    //4 LessEqual     模板测试 或者 深度测试  小于等于 则通过
    //5 Greater       模板测试 或者 深度测试  大于  则通过
    //6 NotEqual      模板测试 或者 深度测试  不等于 则通过
    //7 GreaterEqual  模板测试 或者 深度测试  大于等于
    //8 Always        模板测试 或者 深度测试  永远通过  
    //

    //Stencil Operation 总共八种
    //Keep 保持当前的stencilBufferValue
    //Zero 将值设为0
    //Replace  referenceValue 代替stencilBufferValue
    //incrementSature   将值+1 ,若值为 255 则不变  (不溢出)
    //decrementSature   将值-1 ,若是为0 则不变 (不溢出)
    //invert      按位取反,即若为0 ,则变为255
    //incrementWrap   将值+1 若值为 255 则变为 0 (溢出)
    //decrementWrap   将值-1 若值为 0 则变为 255 (溢出)

    //WriteMask  写入的时候将该值 与 referenceValue 和 stencil BufferValue 分别进行按位与操作
    //ReadMask  读取的时候 将该值maskValue 与 referenceValue 和stencilBufferValue 分别进行 按位与 操作
    //Fail 当 模板测试 和 深度测试 都失败时 进行的处理操作
    //ZFail 当模板测试通过时 深度测试失败时  进行的处理操作

    //ColorMask
    //ColorMask RGB|A|0|其他RGBA的组合
    //ColorMask R 意思是输出 颜色值中只有R 通道会被写入
    //ColorMask 0,意思是不会输出任何颜色
    //默认值为RGBA 即四个通道都写入
    //0-1 A     2-3 B      4-5 G     6-7 BG   8-9 A
    //10-11RB   12-13RG  14-15 RBG

    Properties
    

        _RowCount("RowCount",float) = 0
        _ColCount("ColCount",float) = 0
        _Speed("Speed",float) = 30

        _MainTex("Texture",2D) = "White"
        //用在UI上的shader  一般都需要 加下面的模板测试逻辑 避免呗mask组件的父节点  遮罩时  没有遮罩效果
        _Stencil("Stencil ID",float) = 0    //referenceValue
        _StencilComp("Stencil Comparison",float) = 8  //CompareFunc
        _StencilOp("Stencil Operation",float) = 0 //操作方法
        _StencilWriteMask("Stencil Write Mask",float) = 255
        _StencilReadMask("Stencil Read Mask",float) = 255
        _ColorMask("Color Mask",float) = 15 //11111111  255   
    

    SubShader
    
        Tags
        
            "Queue" = "Transparent"  //一般UI 都是这种渲染队列 从远到近 渲染
            "IgnoreProjector" = "true"  //忽略投影  一般的UIshader 为提高效率  都会设置为true
            "RenderType" = "Transparent"
            "PreviewType" = "Plane" //材质球 预览模式 设为 画片
            "CanUseSpriteAtlas" = "True"  //设置——MainTex 可以使用 Sprite (2D and UI)类型的贴图
        

        Stencil
        
            Ref[_Stencil]
            Comp[_StencilComp]
            ReadMask[_StencilReadMask]
            WriteMask[_StencilWriteMask]
            Pass[_StencilOp]
            //Fail[_StencilOp]
            //ZFail[_StencilOp]
        

        Cull Off   //面的剔除模式   Cull Off 不剔除    Cull Back 剔除背面(背向摄像机的面)  Cull Front 剔除前面(朝向摄像机的面) 
        Lighting Off

        //下面两句设置ZTest 只根据 UI节点 的树层次  作为依据进行测试  不根据Z值
        ZWrite Off //深度写入开关  即在进行完深度测试后  是否 将 深度写入 深度缓存区中  (如果是透明物体 一定要关掉  不然 会出现错误 挡住后面像素输出)
        ZTest[unity_GUIZtestMode] //UI材质的深度测试
        Blend SrcAlpha OneMinusSrcAlpha
        //最终颜色值 = 输出颜色值 * 输出颜色值Alpha值 + 背景颜色值 * (1-a) 挡在前面类似隔着玻璃的效果
        ColorMask[_ColorMask]

        Pass 
        
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #include "UnityUI.cginc"


            struct appdata
            
                float4 vertex:POSITION;
                float4 color:COLOR;
                float2 uv:TEXCOORD0;

            ;

            struct v2f
            
                float4 vertex:SV_POSITION;
                float2 uv:TEXCOORD0;
                fixed4 color:COLOR;
            ;

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _Speed;
            float _RowCount;
            float _ColCount;


            v2f vert(appdata v)
            
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv,_MainTex);
                return o;
            

            fixed4 frag(v2f i):SV_Target
            
                float totalCount = _ColCount * _RowCount;
                float curIndex = floor((_Time.y*_Speed)%totalCount);
                float offsetU = floor(curIndex%_ColCount);//UV起点 U偏移  0,1,2,3,4
                float offsetV = floor(_RowCount - floor(curIndex/_ColCount) - 1); // 0 ,1,2
                float2 unitSize = float2(1/_ColCount,1/_RowCount);
                float2 originUv = float2(offsetU,offsetV) * unitSize;
                float2 newUv = i.uv * unitSize + originUv;
                fixed4 col = tex2D(_MainTex,newUv);
                return col;
            

            ENDCG
        

       
    


以上是关于UGUI序列帧的主要内容,如果未能解决你的问题,请参考以下文章

Unity3d UGUI序列帧动画

时光煮雨 Unity3d 序列目标点的移动①

[UGUI]帧动画

Unity基于响应式编程(Reactive programming)入门

UGUI Image快速创建帧动画

时光煮雨 Unity3D实现2D人物移动-总结篇