一、准备一张精灵表单图片
二、创建shader
Shader "Custom/SpriteSheet" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_TexWidth ("Sheet Width", float) = 0.0
_CellAmount ("Cell Amount", float) = 0.0
_Speed ("Speed", Range(0.01, 32)) = 12
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
float _TexWidth;
float _CellAmount;
float _Speed;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
float2 spriteUV = IN.uv_MainTex;
float cellPixelWidth = _TexWidth/_CellAmount;
float cellUVPercentage = cellPixelWidth/_TexWidth;
//fmod(x,y) : 取模,如果y为0结果不可预料。
float timeVal = fmod(_Time.y * _Speed, _CellAmount);
timeVal = ceil(timeVal);//向上取整
float xValue = spriteUV.x;
xValue += cellUVPercentage * timeVal * _CellAmount;
xValue *= cellUVPercentage;
spriteUV = float2(xValue, spriteUV.y);
half4 c = tex2D (_MainTex, spriteUV);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
三、运行效果
四、优化建议
把时间计算放到C#中进行。
void FixedUpdate(){
timeValue = Mathf.Ceil(Time.time%16);
transform.renderer.material.SetFloat("_TimeValue", timeValue);
}
示例二:精灵表单Shader
Shader代码
Shader "Custom/SpriteSheet" {
Properties{
_MainTex("Base (RGB)", 2D) = "white" {}
_HorizontalAmount("Horizontal Amount", float) = 0.0
_VerticalAmount("Vertical Amount", float) = 0.0
_Speed("Speed", Range(0.01, 32)) = 12
_TransVal("Transparency Value", Range(0, 1)) = 1
}
SubShader{
Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent"}
LOD 400
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma surface surf Lambert alpha
sampler2D _MainTex;
float _HorizontalAmount;
float _VerticalAmount;
float _Speed;
float _TransVal;
struct Input {
float2 uv_MainTex;
};
void surf(Input IN, inout SurfaceOutput o) {
float2 spriteUV = IN.uv_MainTex;
//fmod(x,y) : 取模,如果y为0结果不可预料。
//floor(x) : 向下取整
//_Time.y : 自场景加载开始所经过的时间 (单位:秒)
float time = floor(_Time.y * _Speed);
//行
float row = floor(time / _HorizontalAmount);
//列
float column = floor(fmod(time, _HorizontalAmount));
//定位到当前要显示的帧
spriteUV.x += column;
spriteUV.y -= row;
//将UV的取值范围缩小到每一帧上
spriteUV.x /= _HorizontalAmount;
spriteUV.y /= _VerticalAmount;
half4 c = tex2D(_MainTex, spriteUV);
//漫反射颜色
o.Albedo = c.rgb;
//自发光颜色
o.Emission = c.rgb;
//用灰度值做为alpha
o.Alpha = (c.r * 0.299 + c.g * 0.587 + c.b * 0.114) * _TransVal;
}
ENDCG
}
FallBack "Diffuse"
}
运行效果