Unity循环长箭头加强版

需求变更

我哩个天天,需求这东西就是你做完一个又回有新的一个,做了个普通的,就会让你做高级的。
这不之前做了循环长箭头,领导就说要分段显示,怎么个分段显示咧?能够显示两种颜色的箭头,一种是你还没有走完的路,一种是已经走完的。恩,需求很简单,容我思考下人生。

看来又要学习啦

对unity的shader一直没有深入研究,到目前为止都是停留在能用就行的阶段。复杂一点的shader基本也用可视化的编辑插件进行处理,手打的也就能写写固定功能的shader。可视化的插件很方便,所见即所得,缺点是需要微调的时候就麻烦了。固定着色器功能再多也有限,到头来写Shader还是离不开HLSL和CG语言直接写。当然在Unity中,unity为我们包装了ShaderLab的壳子为我们方便的实现需要的功能,同时不至于代码过于的冗余和晦涩。

同样的Unity提供了官方文档,内容嘛,老规矩全而不细,需要的朋友出门左转,可以翻阅一下:Unity ShaderLab 官方文档

先想想问题,别急着动手

当前的需求是分段显示两种不同颜色的箭头,用于区分哪一部分是已经走过的路线,哪一部分是为走过的路线。在这个需求中需要处理两个贴图,用来表现不同的状态。

方法一:
常规情况下可以直接制作两个箭头的组件,因为在第一版的基础下已经实现了从点A到点B的箭头。分段显示只要处理点A到中间点A'和A'到B两段就行。

灵魂画手A->B
灵魂画手A->A'->B

这样做表面上看起来没有任何问题,实际上也没有任何问题!就是有一点比较麻烦,首先,你需要处理两个箭头,其次,A'点在实际游戏中是移动的,因为人是不断移动的,你就需要不停的调整两个箭头的长度,也就是需要控制两个变量。这种虽然能有但是哪里又有点不对的感觉就好像...

对对对,特么就是这种感觉

方法二:
不就是显示两个材质嘛,直接shader处理,把中间点A'当做属性值传入到shader中,然后就行判断,未到A'点的显示材质一,A'点之后的显示材质二,这样就只需要维护一个箭头,同时移动的时候只需要改shader中传入的A'参数就可以了。恩,很完美,方便使用,一般用起来方便懒的方法,写起了都有些费劲。别问我怎么知道的~~

想好了就动手做

目测原来会的固定功能shader无法实现判断的功能,需要直接写顶点着色器和片段着色器,基础有限就有恶补。涉及到图形图像shader这方面的资料少之又少,中文的就更不多了。推荐大家两个不过的博客,两位大佬也都是出过书的,大家也可以看看:
浅墨的Unity3D
candycat

Shader的实现代码不算复杂,该有的东西也都有,注释也写的很清楚,算是个不错的入门作业,需要的同学可以拿走,记得顺手点个赞哦

Shader "Custom/双色Shader"
{
    //属性
    Properties
    {
        _MainTex("MainTex(RGBA)", 2D) = "white" {} //材质1
        _GrayTex("GrayTex(RGBA)",2D) = "white" {} //材质2
        _CurrentPos("CurrentPos",Range(0,1)) = 1 //当前位置
    }

        SubShader
        {
            LOD 100
            Cull Off Lighting Off ZWrite Off ZTest Always
            Blend SrcAlpha OneMinusSrcAlpha

            Tags
            {
                "Queue" = "Overlay"
                "IgnoreProjector" = "True"
                "RenderType" = "Transparent"
            }

            Pass{
            CGPROGRAM
            #pragma vertex vert  //定义顶点着色器处理单元
            #pragma fragment frag  //定义片段着色器处理单元

            #include "UnityCG.cginc"  
            //变量定义
            uniform sampler2D _MainTex;
            uniform sampler2D _GrayTex;
            uniform fixed  _CurrentPos;
            uniform fixed4 _MainTex_ST;

            //顶点输入结构
            struct vertexInput {
                fixed4 vertex : POSITION;
                fixed4 texcoord0 : TEXCOORD0;
            };

            //片段输入结构(顶点输出)
            struct fragmentInput {
                fixed4 position : SV_POSITION;
                fixed4 texcoord0 : TEXCOORD0;
                fixed2 uv:_MainTex_ST;
            };

            //顶点着色器处理单元
            fragmentInput vert(vertexInput i) {
                fragmentInput o;
                o.position = UnityObjectToClipPos(i.vertex); //转换物体空间到相机空间
                o.texcoord0 = i.texcoord0;
                o.uv = TRANSFORM_TEX(i.texcoord0, _MainTex); //应用材质的Tilling和offset属性
                return o;
            }

            //片段着色器处理单元
            fixed4 frag(fragmentInput i) : SV_Target{
                //判断
                if(i.texcoord0.y >= _CurrentPos)
                    return tex2D(_GrayTex, i.uv);
                else
                    return tex2D(_MainTex, i.uv);
            }
            ENDCG
        }
    }
}

为了优化性能,同时游戏里的需求也不高,所有精度都为fixed,具体项目中可以更具需要进行实际修改。

结语

该学的东西还是要学,总是无法回避的,谁让选择了程序员这条路,就是一条终生学习的路。路上的兄弟共勉之。加油。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容