Blood splatter shader

I’m having an issue with the blood splatter shader i am using. I have pieced it together from the internet (not smart on shaders at all). I believe it is using a stencil buffer. Any blood splatter gets parented to the object that is hit (this is so that objects that move/rotate and continue to have the effect). The problem i have is when the splatter exceeds the object hit, and another object that has the shader attached passes by it the blood splatter is visible on both. Hard to explain in words i will try to upload a picture.(s) to explain

3043279--228060--blood1.PNG 3043279--228061--Blood2.PNG 3043271--228057--Blood3.PNG

In the first image the second enemy is hidden by shadow but you can see the blood splatter projected on his bottom (this is the result of splatter on the ground tile, not the enemy). He moves left more and you can see a different splatter as he moves over another tile. And finally in the third picture you see that he doesnt actually have any splatter on him, it was just the remainder from the other tiles.

Ideally i would like to edit/manipulate the sprite on splatter so that areas where it isn’t painted/visible is permanently edited to the sprite. Not sure how i would do this tho as the shader is simply adjusting the pixels based on the stencil at a point in time (it isn’t a permanent manipulation). Anyone have any thoughts. I’ll provide the shader scripts in case that helps (again i really dont understand them much myself) -

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Splatter/Surface"
{
   Properties
   {
       [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
       _Color ("Tint", Color) = (1,1,1,1)
       [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
       _AlphaCutoff("Alpha Cutoff", Range(0.01, 1.0)) = 0.01
   }

   SubShader
   {
       Tags
       {
           "Queue"="Transparent"
           "IgnoreProjector"="True"
           "RenderType"="Transparent"
           "PreviewType"="Plane"
           "CanUseSpriteAtlas"="True"
       }

       Cull Off
       Lighting Off
       ZWrite Off
       //Blend One OneMinusSrcAlpha

       Pass
       {
           Stencil
           {
               Ref 5
               Comp Always
               Pass Replace
           }

       CGPROGRAM
           #pragma vertex vert
           #pragma fragment frag
           #pragma multi_compile _ PIXELSNAP_ON
           #include "UnityCG.cginc"
         
           struct appdata_t
           {
               float4 vertex   : POSITION;
               float4 color    : COLOR;
               float2 texcoord : TEXCOORD0;
           };

           struct v2f
           {
               float4 vertex   : SV_POSITION;
               fixed4 color    : COLOR;
               half2 texcoord  : TEXCOORD0;
           };
         
           fixed4 _Color;
           fixed _AlphaCutoff;

           v2f vert(appdata_t IN)
           {
               v2f OUT;
               OUT.vertex = UnityObjectToClipPos(IN.vertex);
               OUT.texcoord = IN.texcoord;
               OUT.color = IN.color * _Color;
               #ifdef PIXELSNAP_ON
               OUT.vertex = UnityPixelSnap (OUT.vertex);
               #endif

               return OUT;
           }

           sampler2D _MainTex;
           sampler2D _AlphaTex;
           float _AlphaSplitEnabled;

           fixed4 SampleSpriteTexture (float2 uv)
           {
               fixed4 color = tex2D (_MainTex, uv);
               if (_AlphaSplitEnabled)
                   color.a = tex2D (_AlphaTex, uv).r;

               return color;
           }

           fixed4 frag(v2f IN) : SV_Target
           {
               fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;
               c.rgb *= c.a;

               clip(c.a - _AlphaCutoff);

               return c;
           }
       ENDCG
       }
   }
}

Above is for the surface that can show the platter effect
Below is for the splatter effect

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Splatter/Splatter"
{
   Properties
   {
       [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
       _Color ("Tint", Color) = (1,1,1,1)
       [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
       _Cutoff("AlphaCutoff", Range(0,1)) = 1
   }

   SubShader
   {
       Tags
       {
           "Queue"="Transparent"
           "IgnoreProjector"="True"
           "RenderType"="Transparent"
           "PreviewType"="Plane"
           "CanUseSpriteAtlas"="True"
       }

       Cull Off
       Lighting Off
       ZWrite Off
       //Blend One OneMinusSrcAlpha

       Pass
       {
           Stencil
           {
               Ref 5
               Comp Always
               Pass Replace
           }

       CGPROGRAM
           #pragma vertex vert
           #pragma fragment frag
           #pragma multi_compile _ PIXELSNAP_ON
           #include "UnityCG.cginc"
         
           struct appdata_t
           {
               float4 vertex   : POSITION;
               float4 color    : COLOR;
               float2 texcoord : TEXCOORD0;
           };

           struct v2f
           {
               float4 vertex   : SV_POSITION;
               fixed4 color    : COLOR;
               half2 texcoord  : TEXCOORD0;
           };
         
           fixed4 _Color;

           v2f vert(appdata_t IN)
           {
               v2f OUT;
               OUT.vertex = UnityObjectToClipPos(IN.vertex);
               OUT.texcoord = IN.texcoord;
               OUT.color = IN.color * _Color;
               #ifdef PIXELSNAP_ON
               OUT.vertex = UnityPixelSnap (OUT.vertex);
               #endif

               return OUT;
           }

           sampler2D _MainTex;
           sampler2D _AlphaTex;
           float _AlphaSplitEnabled;

           fixed4 SampleSpriteTexture (float2 uv)
           {
               fixed4 color = tex2D (_MainTex, uv);
               if (_AlphaSplitEnabled)
                   color.a = tex2D (_AlphaTex, uv).r;

               return color;
           }

           fixed4 frag(v2f IN) : SV_Target
           {
               fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;
               c.rgb *= c.a;
               return c;
           }
       ENDCG
       }
   }
}

You want the blood permanently on the affected surface? Its that more to do with the script calling the shader? What is controlling the length of time its display on the screen? You can also try to tag your characters so that if !tag == character draw splatter on object. Or at time of splatter do some raycast from impact point, all objects hit by raycast mark as painted in an array. then check on draw if this object can be splattered. Also if blood splatter is only for surfaces, remove the surface shader from characters(if its currently attached).