Шейдер, описанный в этой главе, будет состоять из двух частей, самого шейдера и крохотного кусочка кода на C#.
Copy Shader "Tutorial/AnimationSequence"
{
Properties
{
_MainTex ( "Animation Texture" , 2D ) = "white" {}
_WidthFramesCount ( "Width Frames count" , Range ( 0 , 20 )) = 9
_HeightFramesCount ( "Height Frames count" , Range ( 0 , 20 )) = 4
_CurrentFrame ( "Frames count" , Range ( 0 , 70 )) = 0
}
SubShader
{
Cull Off
ZWrite Off
ZTest Always
//Следующая строка позволяет визуализировать текстуры,
// содержащие альфаканал, как полупрозрачные.
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
# pragma vertex vert_img
# pragma fragment frag
# include "UnityCG.cginc"
sampler2D _MainTex;
float _WidthFramesCount;
float _HeightFramesCount;
uint _CurrentFrame;
fixed4 frag ( v2f_img i) : COLOR
{
float2 uv = i . uv ;
uint frame = _CurrentFrame % (_WidthFramesCount * _HeightFramesCount);
uv . x = ( uv . x + frame % _WidthFramesCount) / _WidthFramesCount;
uv . y = ( uv . y + floor (frame / _WidthFramesCount)) / _HeightFramesCount;
half4 base = tex2D (_MainTex , uv);
return base;
}
ENDCG
}
}
}
Copy using UnityEngine ;
using System . Collections ;
public class ShaderVariableSetter : MonoBehaviour {
public Material sequenceMaterial;
void Update () {
sequenceMaterial . SetInt ( "_CurrentFrame" , Mathf . FloorToInt ( Time . time * 12 ));
}
}
Этот класс надо прикрепить к одному из объектов в сцене, а потом в поле sequenceMaterial перетянуть материал из вкладки Project
Copy sequenceMaterial.SetInt("_CurrentFrame", Mathf.FloorToInt(Time.time*12));
будет менять переменную _CurrentFrame внутри шейдера. Важно, что если переменная внутри шейдера типа float, то и устанавливать её надо функцией SetFloat, а в нашем случае uint и мы используем функцию SetInt.