Unity shader 圆形进度条

这篇博客详细介绍了如何使用Unity的Shader语言CG来创建一个自定义的Circular ProgressBar Shader。Shader通过输入的背景纹理、遮罩纹理、颜色、速率等属性,实现了在屏幕上动态显示圆形进度的效果。关键代码包括顶点着色器和片段着色器的编写,以及利用角度计算和颜色混合来控制进度条的显示。
Shader "Custom/CircularProgressBarShader"
{
    Properties
    {
        _BGTex("Background Texture",2D) = "white"{}
        //[PerRendererData] 
        _MaskTex("Mask Texture", 2D) = "white" {}
        _Color("Tint", Color) = (1,1,1,1)
        _Rate("Rate", range(0,100)) = 100
        _Center("Center", vector) = (.5,.5,0,0)
        _Width("Width", float) = 1
        //[Toggle(CLOCK_WISE)]
        _ColorMask("Color Mask", Float) = 15
        _MaskDetail("Mask Detail",range(0,1)) = 0.3
    }
    SubShader
    {
      Tags
      {
        "Queue" = "Transparent"
        "IgnoreProjector" = "True"
        "RenderType" = "Transparent"
        "PreviewType" = "Plane"
        "CanUseSpriteAtlas" = "True"
       }
       Cull Off
       Lighting Off
       ZWrite Off
       ZTest[unity_GUIZTestMode]
       Blend SrcAlpha OneMinusSrcAlpha
       ColorMask[_ColorMask]
       Pass
       {
         CGPROGRAM
         #pragma vertex vert
         #pragma fragment frag
         #pragma shader_feature CLOCK_WISE

         #include "UnityCG.cginc"

         float _Rate;
         float4 _Center;
         half _Width;

         struct appdata_t
         {
           float4 vertex   : POSITION;
           float4 color    : COLOR;
           float2 texcoord : TEXCOORD0;
          };

         struct v2f
         {
           float4 vertex   : SV_POSITION;
           fixed4 color    : COLOR;
           half2 mask_uv   : TEXCOORD0;
           half2 bg_uv     : TEXCOORD1;
          };

          fixed4 _Color;
          float4 _ClipRect;
          bool _UseClipRect;
          bool _UseAlphaClip;
          fixed _MaskDetail;
          sampler2D _MaskTex;
          sampler2D _BGTex;
          float4 _MaskTex_ST;
          float4 _BGTex_ST;

          v2f vert(appdata_t IN)
          {
            v2f OUT;
            OUT.vertex = UnityObjectToClipPos(IN.vertex);
            OUT.mask_uv = TRANSFORM_TEX(IN.texcoord,_MaskTex);
            OUT.bg_uv = TRANSFORM_TEX(IN.texcoord,_BGTex);
            OUT.color = IN.color * _Color;
            return OUT;
          }

          fixed4 frag(v2f IN) : SV_Target
          {
            half4 color = tex2D(_MaskTex, IN.mask_uv)* IN.color;
            float2 pos = IN.mask_uv.xy - _Center.xy;
            float ang = degrees(atan2(pos.x, -pos.y)) + 180;
            float angle = _Rate * 3.6;
            color.a = color.a * saturate((ang - angle) / _Width);
            half4 bgcolor = tex2D(_BGTex, IN.bg_uv) * IN.color;
            float mask_a = step(_MaskDetail,color.a);
            color = mask_a * color + (1 - mask_a)*bgcolor;
            return color;
           }
        ENDCG
       }
    }
}

你可以使用 Unity Shader 实现圆形进度条。以下是一个简单的示例代码: ```csharp Shader "Custom/CircularProgressBar" { Properties { _Progress ("Progress", Range(0, 1)) = 0 _Color ("Color", Color) = (1, 1, 1, 1) } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent"} Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; float _Progress; float4 _Color; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.vertex.xy * 0.5 + 0.5; return o; } fixed4 frag (v2f i) : SV_Target { float distance = length(i.uv - 0.5); float alpha = smoothstep(_Progress - 0.01, _Progress, distance); return _Color * alpha; } ENDCG } } } ``` 这个 Shader 使用 smoothstep 函数来计算圆形进度条的透明度。你可以通过修改 `_Progress` 属性来控制进度条的进度。你也可以修改 `_Color` 属性来改变进度条的颜色。 将这个 Shader 应用到一个 Material 上,然后将这个 Material 应用到一个圆形 Mesh 上,就可以得到一个圆形进度条了。 ```csharp using UnityEngine; public class CircularProgressBar : MonoBehaviour { public float progress = 0.5f; public Color color = Color.white; private MeshRenderer meshRenderer; private void Awake() { meshRenderer = GetComponent<MeshRenderer>(); } private void Update() { meshRenderer.material.SetFloat("_Progress", progress); meshRenderer.material.SetColor("_Color", color); } } ``` 这个脚本可以控制圆形进度条的进度和颜色。你可以将这个脚本挂载到圆形 Mesh 上,然后在 Inspector 中修改进度和颜色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值