Глава третья
Изменений свойств материала из C#
Шейдер, описанный в этой главе, будет состоять из двух частей, самого шейдера и крохотного кусочка кода на C#.
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
}
}
}
Этому шейдеру для работы нужна картинка состоящая из кадров анимации. _WidthFramesCount - число кадров в ширину на картинке, _HeightFramesCount - число кадров в высоту.
И C# код:
using UnityEngine;
using System.Collections;
public class ShaderVariableSetter : MonoBehaviour {
public Material sequenceMaterial;
void Update () {
sequenceMaterial.SetInt("_CurrentFrame", Mathf.FloorToInt(Time.time*12));
}
}
Этот класс надо прикрепить к одному из объектов в сцене, а потом в поле sequenceMaterial перетянуть материал из вкладки Project
После этих манипуляций строка:
sequenceMaterial.SetInt("_CurrentFrame", Mathf.FloorToInt(Time.time*12));
будет менять переменную _CurrentFrame внутри шейдера. Важно, что если переменная внутри шейдера типа float, то и устанавливать её надо функцией SetFloat, а в нашем случае uint и мы используем функцию SetInt.
Last updated