Підручник з 2D ігор. Частина 1. Створення персонажів і тонування

У цьому відеоуроці я покажу вам, як створити та розфарбувати простий двовимірний символ в Unity за допомогою шейдера відтінків. Я пишу відтінковий шейдер і скрипт для налаштування персонажа.

Автор: Сергій Тарабан

:ad:

Частина 2

Це перша частина мого підручника. Я збираюся написати інші в найближчій статті.

unity_2d_game_1_character_tint_webplayer_demo

У цій демонстрації я використовую свій засіб вибору кольорів. Ви можете знайти його тут.

Відеоурок

 

Шейдер ColorTint

// Шейдер ColorTint v.1.0
// Copyright (C) 2014 Сергій Тарабан 
//
// Цим надається безкоштовний дозвіл будь-якій особі, яка отримує копію цього програмного забезпечення та пов’язаних файлів документації («Програмне забезпечення»), працювати з Програмним забезпеченням без обмежень, включаючи, без обмежень, права на використання, копіювання, зміну, об’єднання, публікацію, розповсюдження, субліцензування та/або продаж копій Програмного забезпечення, а також дозволяти особам, яким надано Програмне забезпечення, робити це за таких умов:
// Наведене вище повідомлення про авторські права та це повідомлення про дозвіл мають бути включені до всіх копій або значних частин Програмного забезпечення.
// ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ НАДАЄТЬСЯ «ЯК Є», БЕЗ БУДЬ-ЯКИХ ГАРАНТІЙ, ЯВНИХ АБО НЕПРЯМИХ, ВКЛЮЧАЮЧИ, АРЕМЕ ОБМЕЖУЮЧИСЬ, ГАРАНТІЇ ПРИДАТНОСТІ ДЛЯ ПРОДАЖУ, ВІДПОВІДНОСТІ ДЛЯ КОНКРЕТНОЇ МЕТИ ТА ВІДСУМНОСТІ ПРАВ. АВТОРИ АБО ВЛАСНИКИ АВТОРСЬКИХ ПРАВ НЕ НЕСУТЬ ВІДПОВІДАЛЬНОСТІ ЗА БУДЬ-ЯКІ ПРЕТЕНЗІЇ, ЗБИТКИ АБО ІНШУ ВІДПОВІДАЛЬНІСТЬ В наслідок КОНТРАКТНОЇ ДІЇ, ДЕЛІКТУ ЧИ В ІНШОМУ ВИПАДКУ, ЩО ВИНИКАЄ ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ, ВИКОРИСТАННЯ АБО ІНШИМИ ОПЕРАЦІЯМИ, ЧИ У ЗВ’ЯЗКУ З НИМ ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ.
//

Шейдер “Particles/ColorTint” { Властивості { _MainTex (“Текстура частинок”, 2D) = “білий” {} _TintColorRed (“Червоний відтінок”, колір) = (0,5,0,5,0,5,0,5) _TintColorGreen (“Відтінок зеленого кольору”, колір) = (0,5,0,5,0,5,0,5) _TintColorBlue (“Відтінок синього кольору”, колір) = (0,5,0,5,0,5,0,5) }

Категорія { Теги { “Queue”=“Transparent” “IgnoreProjector”=“True” “RenderType”=“Transparent” } Суміш SrcAlpha OneMinusSrcAlpha AlphaTest Greater .01 ColorMask RGB Cull Off Освітлення Off ZWrite Off BindChannels { Переплет «Колір», розфарбов Прив’язка «Вершина», вершина Прив’язати “TexCoord”, texcoord }

// ---- Фрагмент програмних карток
SubShader {
	Пройти {

		CGPROGRAM
		#pragma вершина верт
		#pragma фрагмент фрагмент
		#pragma fragmentoption ARB_precision_hint_fastest
		#pragma multi_compile_particles

		#include "UnityCG.cginc"

		sampler2D _MainTex;
		fixed4 _TintColorRed;
		fixed4 _TintColorGreen;
		fixed4 _TintColorBlue;

		struct appdata_t {
			float4 вершина: POSITION;
			float2 texcoord : TEXCOORD0;
		};

		struct v2f {
			float4 вершина: POSITION;
			float2 texcoord : TEXCOORD0;
		};

		float4 _MainTex_ST;v2f vert (appdata_t v)
		{
			v2f o;
			o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
			o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
			повернення o;
		}

		sampler2D _CameraDepthTexture;
		float _InvFade;

		fixed4 frag (v2f i): КОЛІР
		{	
			float4 baseColor = tex2D(_MainTex, i.texcoord);
			float alpha = baseColor.a;
			baseColor = alpha * (baseColor.r * _TintColorRed + baseColor.g * _TintColorGreen + baseColor.b * _TintColorBlue);
			baseColor.a = 1.0f - крок (альфа, 0.1);
			повернути baseColor;
		}
		ENDCG 
	}
}

} }

Сценарій програвача

// Copyright (C) 2014 Сергій Тарабан 
//
// Цим надається безкоштовний дозвіл будь-якій особі, яка отримує копію цього програмного забезпечення та пов’язаних файлів документації («Програмне забезпечення»), працювати з Програмним забезпеченням без обмежень, включаючи, без обмежень, права на використання, копіювання, зміну, об’єднання, публікацію, розповсюдження, субліцензування та/або продаж копій Програмного забезпечення, а також дозволяти особам, яким надано Програмне забезпечення, робити це за таких умов:
// Наведене вище повідомлення про авторські права та це повідомлення про дозвіл мають бути включені до всіх копій або значних частин Програмного забезпечення.
// ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ НАДАЄТЬСЯ «ЯК Є», БЕЗ БУДЬ-ЯКИХ ГАРАНТІЙ, ЯВНИХ АБО НЕПРЯМИХ, ВКЛЮЧАЮЧИ, АРЕМЕ ОБМЕЖУЮЧИСЬ, ГАРАНТІЇ ПРИДАТНОСТІ ДЛЯ ПРОДАЖУ, ВІДПОВІДНОСТІ ДЛЯ КОНКРЕТНОЇ МЕТИ ТА ВІДСУМНОСТІ ПРАВ. АВТОРИ АБО ВЛАСНИКИ АВТОРСЬКИХ ПРАВ НЕ НЕСУТЬ ВІДПОВІДАЛЬНОСТІ ЗА БУДЬ-ЯКІ ПРЕТЕНЗІЇ, ЗБИТКИ АБО ІНШУ ВІДПОВІДАЛЬНІСТЬ В наслідок КОНТРАКТНОЇ ДІЇ, ДЕЛІКТУ ЧИ В ІНШОМУ ВИПАДКУ, ЩО ВИНИКАЄ ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ, ВИКОРИСТАННЯ АБО ІНШИМИ ОПЕРАЦІЯМИ, ЧИ У ЗВ’ЯЗКУ З НИМ ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ.
//

public class Player : MonoBehaviour {

public Transform head;
громадський трансформаційний орган;
public Transform hand_left;
public Transform hand_right;

публічний колір HairColor;
загальнодоступний колір EyeColor;
публічний колір SkinColor;
загальнодоступний колір BodyColor;

// Викликається в режимі редактора
void OnValidate()
{
	ColorTint();
}

// Використовуйте це для ініціалізації
void Start () {
	ColorTint();
}

// Оновлення викликається один раз на кадр
void Оновити () {

}

void ColorTint()
{
	if(head != null)
	{
		Material tempMaterial = new Material(head.GetComponent<Renderer>().sharedMaterial);
		tempMaterial.SetColor("_TintColorRed", SkinColor);
		tempMaterial.SetColor("_TintColorBlue", Колір волосся);
		tempMaterial.SetColor("_TintColorGreen", EyeColor);
		head.GetComponent<Renderer>().material = tempMaterial;
	}
	if(body != null)
	{
		Material tempMaterial = new Material(body.GetComponent<Renderer>().sharedMaterial);
		tempMaterial.SetColor("_TintColorGreen", BodyColor);
		body.GetComponent<Renderer>().material = tempMaterial;
	}
	if(hand_left != null && hand_right != null)
	{
		Material tempMaterial = new Material(hand_left.GetComponent<Renderer>().sharedMaterial);
		tempMaterial.SetColor("_TintColorRed", SkinColor);
		hand_left.GetComponent<Renderer>().material = tempMaterial;
		hand_right.GetComponent<Renderer>().material = tempMaterial;
	}
}

}

 Автор: Сергій Тарабан

Пов’язані публікації