需要前置条件有以下几点:
1 需要一张能够无缝连接并循环的图片(图片不连续 会在交接的地方 出现一条缝隙)
2 将图片的 WrapMode格式改为 Repeat
3 具体sader代码如下
//图片的WrapMode需要设置为Repeat
Shader "Custom/CirculationBg"
{
Properties
{
_MainTex("Texture", 2D) = "white" {}
_ScrollXSpeed("X Scroll Speed",Range(0,10)) = 2
_ScrollYSpeed("Y Scroll Speed",Range(0,10)) = 0
}
SubShader
{
Tags { "RenderType" = "Opaque" }
LOD 100Pass
{
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;
float _ScrollXSpeed;
float _ScrollYSpeed;v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}fixed4 frag(v2f i) : SV_Target
{
float2 uv = i.uv;float xNew = frac(_ScrollXSpeed * _Time); //frac是取小数的函数 如1.23 取出来是 0.23
float yNew = frac(_ScrollYSpeed * _Time);
uv += float2(xNew,yNew);float4 col = tex2D(_MainTex, uv);
return col;
}
ENDCG
}
}
Fallback "VertexLit"
}
4 注意 shader 里面的代码 的变量精度 必须要是float 类型 ,如果使用fixed 或者 half 时,会导致在移动时间长之后背景抖动问题(原因可能是因为uv 值的限定范围在0 到1之间,如果值大于1以后会将大于的部分进行裁剪掉,所以 在执行frac 函数时,如果精度不足时裁剪过大时,出现移动不太连续的问题)。如果不使用frac 函数而使用原始数值时,会使xNew 会随着时间的增长越来越大,也会导致背景抖动问题(uv裁剪导致)。