先上效果
有个问题就是,UISprie用的Atlas的公用的材质,无法从当前要绘制的片段shader上获得uv百分比,所以当有其他的Sprite使用相同的Atlas时显示就有问题
其实Mesh是可以接受另外一套uv的,不过目前还没有找到给NGUI造的mesh传另外一套uv的方法。
//代码
using System; using UnityEngine; using System.Collections; public class UIRoundSprite : UISprite { public float RoundRate = 0.8f; protected override void OnUpdate () { if(mChanged) { var atlas = GetAtlasSprite(); if (null != atlas && null != material) { var w = material.mainTexture.width; var h = material.mainTexture.height; var sx = atlas.x*1.0f/w; var sy = atlas.y * 1.0f / h; var wr = atlas.width * 1.0f / w; var hr = atlas.height * 1.0f / h; var wr_2 = wr/2; var hr_2 = hr/2; material.SetFloat("_CenterX", sx + wr_2); material.SetFloat("_CenterY", sy + hr_2); material.SetFloat("_Width", wr_2); material.SetFloat("_Height", hr_2); material.SetFloat("_LengthRate", RoundRate); } } base.OnUpdate(); } }
//Shader
Shader "Unlit/Transparent Colored Round" { Properties { _MainTex ("Base (RGB), Alpha (A)", 2D) = "black" {} _CenterX("CenterX", Float) = 0.0 _CenterY("CenterY", Float) = 0.0 _Width("Width", Float) = 0.0 _Height("Height", Float) = 0.0 _LengthRate("LengthRate", Float) = 0.0 } SubShader { LOD 200 Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } Pass { Cull Off Lighting Off ZWrite Off Fog { Mode Off } Offset -1, -1 Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" sampler2D _MainTex; float4 _MainTex_ST; float _CenterX; float _CenterY; float _Width; float _Height; float _LengthRate; struct appdata_t { float4 vertex : POSITION; float2 texcoord : TEXCOORD0; fixed4 color : COLOR; }; struct v2f { float4 vertex : SV_POSITION; half2 texcoord : TEXCOORD0; fixed4 color : COLOR; }; v2f o; v2f vert (appdata_t v) { o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.texcoord = v.texcoord; o.color = v.color; return o; } fixed4 frag (v2f IN) : COLOR { float2 pt = IN.texcoord-float2(_CenterX,(1-_CenterY)); if((pt.x*pt.x)/(_Width*_Width)+(pt.y*pt.y)/(_Height*_Height)>_LengthRate) { discard; } return tex2D(_MainTex, IN.texcoord) * IN.color; } ENDCG } } SubShader { LOD 100 Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } Pass { Cull Off Lighting Off ZWrite Off Fog { Mode Off } Offset -1, -1 ColorMask RGB Blend SrcAlpha OneMinusSrcAlpha ColorMaterial AmbientAndDiffuse SetTexture [_MainTex] { Combine Texture * Primary } } } }