[Shader]血条

该Shader脚本用于在Unity中创建动态血条效果,血条颜色会随着数值变化,当血量低于一定值时血条会闪烁。它使用了_Lerp函数的逆运算来计算比例,并结合_CGINC中的纹理和数学函数来控制血条的显示和颜色动画。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

①血条颜色随数值变化

②血量低于一定值,血条闪烁

Shader "MyShader/Healthbar"
{
    Properties
    {
        [NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
        _Health("Health",Range(0,1)) = 1
        _BorderSize("Border Size",Range(0,0.5)) = 1
    }
    SubShader
    {
        Tags { "RenderType"= "Opaque"}

        Pass
        {
            ZWrite Off
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct MeshData
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct Interpolators
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float _Health;
            float _BorderSize;

            Interpolators vert (MeshData v)
            {
                Interpolators o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            float InverseLerp(float a,float b,float v)
            {
                return (v-a)/(b-a);
            }

            float4 frag (Interpolators i) : SV_Target
            {
                float2 coords = i.uv;
                coords.x *= 8;

                float2 pointOnLineSeg = float2(clamp(coords.x,0.5,7.5),0.5);
                float sdf = distance(coords,pointOnLineSeg)*2 - 0.4;
                clip(-sdf);
                float borderSdf = sdf + _BorderSize;
                float pd = fwidth(borderSdf);
                float borderMask = 1 - saturate(borderSdf/pd);
                
                float healthbarMask = _Health > i.uv.x;
                
                float3 healthbarColor = tex2D(_MainTex, float2(_Health,i.uv.y));

                if (_Health < 0.2)
                {
                    float flash = cos(_Time.y * 4) * 0.4 + 1;
                    healthbarColor *= flash;
                }
                
                return float4(healthbarColor * healthbarMask * borderMask,1);
            }
            ENDCG
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值