zamoth

Untitled

Sep 3rd, 2025 (edited)
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.94 KB | None | 0 0
  1. Shader "Unlit/DamageIndicator"
  2. {
  3.     Properties
  4.     {
  5.         _MainTex ("Texture", 2D) = "white" {}
  6.     }
  7.     SubShader
  8.     {
  9.         Tags { "RenderType"="Opaque" }
  10.         LOD 100
  11.  
  12.         Pass // Damage Indicators
  13.         {
  14.             Name "Damage Indicators - Render"
  15.             AlphaToMask On
  16.             CGPROGRAM
  17.             #pragma vertex vert
  18.             #pragma fragment frag
  19.  
  20.             #include "UnityCG.cginc"
  21.  
  22.             struct appdata
  23.             {
  24.                 float4 vertex : POSITION;
  25.                 float2 uv : TEXCOORD0;
  26.                 float2 index : TEXCOORD1;
  27.                 float4 vcol : COLOR0;
  28.             };
  29.  
  30.             struct v2f
  31.             {
  32.                 float2 uv : TEXCOORD0;
  33.                 float4 vertex : SV_POSITION;
  34.                 float4 color : COLOR0;
  35.             };
  36.  
  37.             sampler2D _MainTex;
  38.             float4 _MainTex_ST;
  39.             float4 _Color;
  40.             float _Alpha;
  41.             bool _IsCrit;
  42.             bool _IsMiss;
  43.             int _Value;
  44.             float _LifeTime;
  45.             float _CritJitter;
  46.  
  47.             struct DamageIndicator
  48.             {
  49.                 int digits[5];
  50.                 int count;
  51.                 int magnitude;
  52.             };
  53.  
  54.             inline DamageIndicator GetDamageIndicator(int n)
  55.             {
  56.                 DamageIndicator di;
  57.  
  58.                 uint un = (uint)abs(n);
  59.  
  60.                 int mag = 0;
  61.                 uint scaled = un;
  62.                 if (un > 999999u)
  63.                 {
  64.                     mag = 2;
  65.                     scaled = un / 1000000u;
  66.                 }
  67.                 else if (un > 99999u)
  68.                 {
  69.                     mag = 1;
  70.                     scaled = un / 1000u;
  71.                 }
  72.  
  73.                 UNITY_UNROLL
  74.                 for (int i = 0; i < 5; i++)
  75.                 {
  76.                     di.digits[i] = -1;
  77.                 }
  78.  
  79.                 if (scaled == 0u)
  80.                 {
  81.                     di.digits[4] = 0;
  82.                     di.count = 1;
  83.                     di.magnitude = mag;
  84.                     return di;
  85.                 }
  86.                
  87.                 uint tmp = scaled;
  88.                 int idx = 4;
  89.                 UNITY_UNROLL
  90.                 for (int i = 0; i < 5 && tmp > 0u; i++)
  91.                 {
  92.                     di.digits[idx--] = (int)(tmp % 10u);
  93.                     tmp /= 10u;
  94.                 }
  95.  
  96.                 int cnt = 0;
  97.                 [unroll]
  98.                 for (int i = 0; i < 5; i++)
  99.                     cnt += (di.digits[i] >= 0) ? 1 : 0;
  100.  
  101.                 di.count = cnt;
  102.                 di.magnitude = mag;
  103.                 return di;
  104.             }
  105.            
  106.             v2f vert (appdata v)
  107.             {
  108.                 float critMask = v.vcol.r;
  109.                 float digitMask = v.vcol.g;
  110.                 float missMask = v.vcol.b;
  111.                
  112.                 v.vertex *= !(critMask * !_IsCrit);
  113.                 v.vertex *= !(missMask * !_IsMiss);
  114.                 v.vertex *= !(digitMask * _IsMiss);
  115.  
  116.                 float offset = 0.1;
  117.                 int digitIndex = v.index * (1/offset);
  118.                
  119.                 DamageIndicator di = GetDamageIndicator(_Value);
  120.  
  121.                 switch (di.magnitude)
  122.                 {
  123.                     default:
  124.                     case 0:
  125.                         v.uv.x += di.digits[digitIndex] * offset * digitMask;
  126.                         break;
  127.                     case 1:
  128.                     case 2:
  129.                         if (digitIndex == 4)
  130.                         {
  131.                             v.uv.y -= offset * 2;
  132.                             v.uv.x += offset * (di.magnitude - 1);
  133.                         }
  134.                         else
  135.                         {
  136.                             v.uv.x += di.digits[digitIndex + 1] * offset * digitMask;
  137.                         }
  138.                         break;
  139.                 }
  140.                
  141.                 v.vertex.x -= (di.count + min(di.magnitude, 1)) * 0.25 * digitMask; // digits are 0.25m
  142.                 v.vertex.x += _CritJitter * critMask * 0.5; // Crit mesh is 2m x 2m
  143.                
  144.                 v2f o;
  145.                 o.vertex = UnityObjectToClipPos(v.vertex);
  146.                 o.vertex.z = lerp(0.9, 0.1, _LifeTime);
  147.                 o.uv = TRANSFORM_TEX(v.uv, _MainTex);
  148.                 o.color = lerp(1, _Color, digitMask) * lerp(1, 0.8, _IsCrit * critMask);
  149.                 return o;
  150.             }
  151.  
  152.             fixed4 frag (v2f i) : SV_Target
  153.             {
  154.                 fixed4 col = tex2D(_MainTex, i.uv);
  155.                 clip(col.a - 0.5);
  156.  
  157.                 col.rgb *= i.color;
  158.                 col.a = _Alpha;
  159.                 return col;
  160.             }
  161.             ENDCG
  162.         }
  163.  
  164.         Pass // Blit
  165.         {
  166.             Name "Damage Indicators - Blit"
  167.             //Cull Off
  168.             Blend SrcAlpha OneMinusSrcAlpha
  169.             ZTest Always
  170.             CGPROGRAM
  171.             #pragma vertex vert
  172.             #pragma fragment frag
  173.  
  174.             #include "UnityCG.cginc"
  175.  
  176.             struct appdata
  177.             {
  178.                 float4 vertex : POSITION;
  179.                 float2 uv : TEXCOORD0;
  180.             };
  181.  
  182.             struct v2f
  183.             {
  184.                 float2 uv : TEXCOORD0;
  185.                 float4 vertex : SV_POSITION;
  186.             };
  187.  
  188.             sampler2D _MainTex;
  189.             float4 _MainTex_ST;
  190.            
  191.             v2f vert (appdata v)
  192.             {
  193.                 v2f o;
  194.                 o.vertex = v.vertex;
  195.                 #if UNITY_UV_STARTS_AT_TOP
  196.                 o.uv = float2(v.uv.x, 1-v.uv.y);
  197.                 #else
  198.                 o.uv = v.uv;
  199.                 #endif
  200.                 return o;
  201.             }
  202.  
  203.             fixed4 frag (v2f i) : SV_Target
  204.             {
  205.                 fixed4 col = tex2D(_MainTex, i.uv);
  206.                 return col;
  207.             }
  208.             ENDCG
  209.         }
  210.     }
  211. }
  212.  
Advertisement
Add Comment
Please, Sign In to add comment