unity中基于NGUI实现一张图片上在某个地方挖个洞

来源:互联网 发布:iphone软件怎么做 编辑:程序博客网 时间:2024/04/23 19:48

按照策划的要求,引导时只有被引导的图片是高亮的,其余地方都是黑色半透明,如下图所示:




对应的实现shader如下:


Shader "Unlit/TutorialBg"{Properties{_MainTex ("Base (RGB), Alpha (A)", 2D) = "black" {}_ClipRange0 ("Clip Vector", Vector) = (0.0, 0.0, 1.0, 1.0)// (x, y, z, w)}SubShader{LOD 200Tags{"Queue" = "Transparent""IgnoreProjector" = "True""RenderType" = "Transparent"}Pass{Cull OffLighting OffZWrite OffFog { Mode Off }Offset -1, -1Blend SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _MainTex;float4 _ClipRange0;float2 _ClipArgs0 = float2(1000.0, 1000.0);struct appdata_t{float4 vertex : POSITION;float2 texcoord : TEXCOORD0;fixed4 color : COLOR;};struct v2f{float4 vertex : SV_POSITION;half2 texcoord : TEXCOORD0;fixed4 color : COLOR;float2 worldPos : TEXCOORD1;};v2f o;v2f vert (appdata_t v){o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);o.texcoord = v.texcoord;o.color = v.color;o.worldPos = v.vertex.xy * _ClipRange0.zw + _ClipRange0.xy;return o;}half4 frag (v2f IN) : COLOR{float2 factor = abs(IN.worldPos);half4 col = tex2D(_MainTex, IN.texcoord) * IN.color;;if(floor(factor.x) == 0 && floor(factor.y) == 0) {col.a = 0;}return col;}ENDCG}}SubShader{LOD 100Tags{"Queue" = "Transparent""IgnoreProjector" = "True""RenderType" = "Transparent"}Pass{Cull OffLighting OffZWrite OffFog { Mode Off }Offset -1, -1ColorMask RGBBlend SrcAlpha OneMinusSrcAlphaColorMaterial AmbientAndDiffuseSetTexture [_MainTex]{Combine Texture * Primary}}}}

代码中需要调整透明区域的位置,通过下面的代码来调整:

 private void updateBgClip() {         Renderer bgRendere =  background.GetComponent<Renderer>();        if(bgRendere == null)            return;        float width = 100;        float height = 100;        Vector3 worldPos = Vector3.zero;        UIWidget spriteCompont = targetButton.GetComponent<UIWidget>();        if (spriteCompont != null)        {            background.SetActive(true);            width = spriteCompont.width / 2f;            height = spriteCompont.height / 2f;            worldPos = targetButton.position;        }        else {             //no ui widget. get collide bondry            Collider col = targetButton.GetComponent<Collider>();            BoxCollider boxCollider = col as BoxCollider;            if (boxCollider != null)            {                background.SetActive(true);                worldPos = boxCollider.bounds.center;                width = boxCollider.size.x/2f;                height =  boxCollider.size.y/2f;            }        }        Vector3 localPos = bgRendere.transform.InverseTransformPoint(targetButton.position);        bgRendere.material.SetVector("_ClipRange0", new Vector4(-localPos.x / width, -localPos.y / height, 1 / width, 1 / height));    }


0 0
原创粉丝点击