Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Shader "Unlit/DamageIndicator"
- {
- Properties
- {
- _MainTex ("Texture", 2D) = "white" {}
- }
- SubShader
- {
- Tags { "RenderType"="Opaque" }
- LOD 100
- Pass // Damage Indicators
- {
- Name "Damage Indicators - Render"
- AlphaToMask On
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #include "UnityCG.cginc"
- struct appdata
- {
- float4 vertex : POSITION;
- float2 uv : TEXCOORD0;
- float2 index : TEXCOORD1;
- float4 vcol : COLOR0;
- };
- struct v2f
- {
- float2 uv : TEXCOORD0;
- float4 vertex : SV_POSITION;
- float4 color : COLOR0;
- };
- sampler2D _MainTex;
- float4 _MainTex_ST;
- float4 _Color;
- float _Alpha;
- bool _IsCrit;
- bool _IsMiss;
- int _Value;
- float _LifeTime;
- float _CritJitter;
- struct DamageIndicator
- {
- int digits[5];
- int count;
- int magnitude;
- };
- inline DamageIndicator GetDamageIndicator(int n)
- {
- DamageIndicator di;
- uint un = (uint)abs(n);
- int mag = 0;
- uint scaled = un;
- if (un > 999999u)
- {
- mag = 2;
- scaled = un / 1000000u;
- }
- else if (un > 99999u)
- {
- mag = 1;
- scaled = un / 1000u;
- }
- UNITY_UNROLL
- for (int i = 0; i < 5; i++)
- {
- di.digits[i] = -1;
- }
- if (scaled == 0u)
- {
- di.digits[4] = 0;
- di.count = 1;
- di.magnitude = mag;
- return di;
- }
- uint tmp = scaled;
- int idx = 4;
- UNITY_UNROLL
- for (int i = 0; i < 5 && tmp > 0u; i++)
- {
- di.digits[idx--] = (int)(tmp % 10u);
- tmp /= 10u;
- }
- int cnt = 0;
- [unroll]
- for (int i = 0; i < 5; i++)
- cnt += (di.digits[i] >= 0) ? 1 : 0;
- di.count = cnt;
- di.magnitude = mag;
- return di;
- }
- v2f vert (appdata v)
- {
- float critMask = v.vcol.r;
- float digitMask = v.vcol.g;
- float missMask = v.vcol.b;
- v.vertex *= !(critMask * !_IsCrit);
- v.vertex *= !(missMask * !_IsMiss);
- v.vertex *= !(digitMask * _IsMiss);
- float offset = 0.1;
- int digitIndex = v.index * (1/offset);
- DamageIndicator di = GetDamageIndicator(_Value);
- switch (di.magnitude)
- {
- default:
- case 0:
- v.uv.x += di.digits[digitIndex] * offset * digitMask;
- break;
- case 1:
- case 2:
- if (digitIndex == 4)
- {
- v.uv.y -= offset * 2;
- v.uv.x += offset * (di.magnitude - 1);
- }
- else
- {
- v.uv.x += di.digits[digitIndex + 1] * offset * digitMask;
- }
- break;
- }
- v.vertex.x -= (di.count + min(di.magnitude, 1)) * 0.25 * digitMask; // digits are 0.25m
- v.vertex.x += _CritJitter * critMask * 0.5; // Crit mesh is 2m x 2m
- v2f o;
- o.vertex = UnityObjectToClipPos(v.vertex);
- o.vertex.z = lerp(0.9, 0.1, _LifeTime);
- o.uv = TRANSFORM_TEX(v.uv, _MainTex);
- o.color = lerp(1, _Color, digitMask) * lerp(1, 0.8, _IsCrit * critMask);
- return o;
- }
- fixed4 frag (v2f i) : SV_Target
- {
- fixed4 col = tex2D(_MainTex, i.uv);
- clip(col.a - 0.5);
- col.rgb *= i.color;
- col.a = _Alpha;
- return col;
- }
- ENDCG
- }
- Pass // Blit
- {
- Name "Damage Indicators - Blit"
- //Cull Off
- Blend SrcAlpha OneMinusSrcAlpha
- ZTest Always
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #include "UnityCG.cginc"
- struct appdata
- {
- float4 vertex : POSITION;
- float2 uv : TEXCOORD0;
- };
- struct v2f
- {
- float2 uv : TEXCOORD0;
- float4 vertex : SV_POSITION;
- };
- sampler2D _MainTex;
- float4 _MainTex_ST;
- v2f vert (appdata v)
- {
- v2f o;
- o.vertex = v.vertex;
- #if UNITY_UV_STARTS_AT_TOP
- o.uv = float2(v.uv.x, 1-v.uv.y);
- #else
- o.uv = v.uv;
- #endif
- return o;
- }
- fixed4 frag (v2f i) : SV_Target
- {
- fixed4 col = tex2D(_MainTex, i.uv);
- return col;
- }
- ENDCG
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment