Глава третья

Изменений свойств материала из 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
		}
	}
}

И 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