思路:
(1)提高画方型函数,并支持可自转功能
(2)以fixed2(0.5, 0.5)为圆点,在圆点、正右、右上、正上、左上、正左、左下、正下、右下9个方位画上方型
(3)圆点方型做缩放动画,其余方型做自转以及直线来回运动,
代码如下:
Shader "Hidden/Loading"
{
Properties
{
_Color("Color", Color) = (1, 1, 1, 1)
_Move("Move", Range(0, 1)) = 0.1
_Breath("Breath", float) = 0.1
_Wait("Wait", Range(0, 1)) = 0
_Angle("Angle", float) = 0.1
_Width("Width", Range(0, 1)) = 0.1
}
SubShader
{
Blend SrcAlpha OneMinusSrcAlpha
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 vertex : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 _Color;
fixed _Width;
fixed _Wait;
fixed _Move;
fixed _Angle;
fixed _Breath;
fixed drawRect(int index, fixed2 uv, fixed2 center, fixed2 size)
{
fixed2 newUv = uv - center;
fixed angle = step(1, index) * (_Time.y * _Breath + radians(index * 30));
newUv = fixed2(newUv.x * cos(angle) - newUv.y * sin(angle), newUv.x * sin(angle) + newUv.y * cos(angle));
return step(-0.5 * size.x, newUv.x) * step(newUv.x, 0.5 * size.x) * step(-0.5 * size.y, newUv.y) * step(newUv.y, 0.5 * size.y);
}
fixed2 getRectCenter(int index)
{
fixed2 rectCenters[9];
rectCenters[0] = fixed2( 0, 0);
rectCenters[1] = fixed2( 1, 0);
rectCenters[2] = fixed2( 1, 1);
rectCenters[3] = fixed2( 0, 1);
rectCenters[4] = fixed2(-1, 1);
rectCenters[5] = fixed2(-1, 0);
rectCenters[6] = fixed2(-1, -1);
rectCenters[7] = fixed2( 0, -1);
rectCenters[8] = fixed2( 1, -1);
return rectCenters[index];
}
fixed4 frag (v2f i) : SV_Target
{
_Color.a = 0;
for(int z = 0; z < 9; z++)
{
fixed w = _Width;
fixed curTime = _Time.y - (z - 1) * _Wait;
curTime = step(0, curTime) * curTime;
fixed add = smoothstep(0, 1, abs(sin(curTime)));
fixed2 rectCenter = _Move * add * getRectCenter(z);
add = smoothstep(0, 1, 1 - abs(sin(_Time.y)));
w += step(z, 0) * _Move * add;
_Color.a += drawRect(z, i.uv, rectCenter + fixed2(0.5, 0.5), fixed2(w, w));
}
return _Color;
}
ENDCG
}
}
}