¿Cómo puedo crear el efecto de desenfoque similar al agua en Chameleon Run usando SpriteKit y Unity?

A medida que se ejecuta el personaje en Chameleon Run , se crea un efecto de desenfoque similar al agua. Realmente apreciaría algunas pautas sobre cómo podría crear este efecto en SpriteKit y Unity. Por favor, mira la image a continuación.

enter image description here

Me parece que esto podría hacerse con un TrailRenderer . Esto deja una cinta de geometry 3D detrás de un object en movimiento, sobre la cual podemos asignar un material para controlar la forma en que representa.

Podemos usar un sombreador personalizado que incorpore un GrabPass para tomar una instantánea del buffer del cuadro , muestreándolo con una compensación de distorsión, para get un aspecto refractivo y acuoso:

Shader "Unlit/DistortionTrail" { Properties { _Intensity ("Intensity", Range(-1, 1)) = 1 } SubShader { Tags { "RenderType"="Transparent" "Queue"="Transparent"} LOD 100 GrabPass {"_Refract"} Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 projected : TEXCOORD1; float4 vertex : SV_POSITION; }; sampler2D _Refract; float2 _Refract_TexelSize; float _Intensity; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; o.projected = o.vertex; // Some video settings flip the captunetworking image - flip it back. #if UNITY_UV_STARTS_AT_TOP o.projected.y *= sign(_Refract_TexelSize.y); #endif return o; } fixed4 frag (v2f i) : SV_Target { // Convert interpolated vertex position in device coordinates // into a texture coordinate in the range 0...1 float2 screenUV = (i.projected.xy / i.projected.w) * 0.5f + 0.5f; // Ripple the distortion across the width of the trail. // (squaring y makes the ripples look a bit less rigid/uniform) float distortion = sin(i.uv.y * i.uv.y * 3.141592653589f * 5.0f); // Fade the distortion along the length of the trail. distortion *= 1.0f - i.uv.x; // Control max distortion using material parameter. distortion *= _Intensity; // Offset our lookup coordinates using the distortion. screenUV += distortion * float2(0.5, 1); // Sample the captunetworking snapshot of the frame. fixed4 col = tex2D(_Refract, screenUV); return col; } ENDCG } } } 

Aquí hay un ejemplo de esto en movimiento:

enter image description here