Підручник з 2D ігор. Частина 2. 2D персонаж з кількома станами і динамічною зміною спрайтів

У цьому відеопосібнику я розповім про двовимірного персонажа, поєднаного з випадковими наборами спрайтів і який має декілька станів, як-от ходьба, бездіяльність тощо. Цей персонаж може складатися з багатьох різних наборів спрайтів і динамічно їх змінювати, що дозволяє створювати багато різних персонажів, використовуючи однакову анімацію та логіку руху.

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

:ad:

Частина 1. Створення та відтінки персонажів

У мене є персонажі дівчинка і хлопчик. У обох по кілька голів з різними стрижками. Ці персонажі мають п’ять станів: бездіяльність, ходьба зверху, ходьба внизу, ходьба ліворуч і ходьба праворуч. Мені потрібно змінити ці стани під час переміщення персонажа в певному напрямку.

Для цього я пишу дуже корисний скрипт для динамічної зміни стану та спрощення роботи з різними спрайтами для одного персонажа.

План уроку:

  1. Огляд проблеми. Спрайти дівчинки та хлопчика
  2. Налаштування та використання сценарію для простої зміни стану
  3. Додавання функції зміни набору спрайтів (різні стрижки)
  4. Генерація випадкових символів

Сценарій MultiSpriteCharacter

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

[System.Serializable] відкритий клас SpritePartInfo { публічна частина трансформації; публічний рядок SpriteName; загальнодоступна шкала Vector3 = Vector3.one; }

[System.Serializable] відкритий клас SpriteSetForPart { публічна частина трансформації; public int CurrSpriteID = -1; }

[System.Serializable] відкритий клас AnimPartInfo { відкритий рядок StateInfo; //лише читання public SpritePartInfo[] SpriteParts = new SpritePartInfo[1]; };

публічний клас MultiSpriteCharacter: MonoBehaviour {

публічний перелік eState
{
	ЗА ПРОМОВЧАННЯМ = 0,
	MOVE_TOP,
	MOVE_BOTTOM,
	MOVE_LEFT,
	MOVE_RIGHT,
};
public eState State = eState.DEFAULT;

static char[] Separator = {'#'};

публічний рядок MainSpriteName = ""; 

public SpriteSetForPart[] SpriteSet = null;
public AnimPartInfo[] AnimPartDesc = new AnimPartInfo[1];

void OnValidate()
{
	UpdateParts();
}

void Start () {
	UpdateParts();
}public void SetState(стан eState)
{
	Стан = стан;
	UpdateParts();
}

void UpdateParts()
{
	bool error = false;
	UnityEngine.Object[] спрайти = Resources.LoadAll(MainSpriteName) як UnityEngine.Object[];
	if(sprites == null || sprites.GetLength(0) == 0) {
		помилка = вірно;
	}
	int i = 0;
	foreach(перемінна частина в AnimPartDesc)
	{
		if(part != null)
		{
			part.StateInfo = ((eState)i).ToString();
			якщо (помилка)
			{
				part.StateInfo = "ПОМИЛКА";
				продовжити;
			}
		}
		i++;
	}
	if((int)State < AnimPartDesc.GetLength(0)) { AnimPartInfo part = AnimPartDesc[(int)State]; 			if(part.SpriteParts != null) { foreach(var spritePart in part.SpriteParts) { if(spritePart.Part == null) { продовжити; 					} UnityEngine.Sprite spr = null; 					//обробка символу '#' SpriteSetForPart spriteSetForPart = System.Array.Find(SpriteSet, s => s.Part.name == spritePart.Part.name) as SpriteSetForPart;
				if(spriteSetForPart != null)
				{
					int spriteSetID = spriteSetForPart.CurrSpriteID;
					string spriteName = spritePart.SpriteName;
					string[] splitSpriteNames = spriteName.Split(Separator);
					bool is_two_part_sprite = splitSpriteNames.GetLength(0) > 1;
					if(is_two_part_sprite) {
						spriteName = splitSpriteNames[0] + spriteSetID + splitSpriteNames[1];
					}
					ще {
						spriteName = splitSpriteNames[0] + spriteSetID;
					}
					spr = System.Array.Find(sprites, s => s.name == spriteName) як UnityEngine.Sprite;
					if(spr == null)
					{
						if(is_two_part_sprite) {
							spriteName = splitSpriteNames[0] + splitSpriteNames[1];
						}
						ще {
							spriteName = splitSpriteNames[0];
						}
						spr = System.Array.Find(sprites, s => s.name == spriteName) як UnityEngine.Sprite;
					}
				}
				інше
				{
					spr = System.Array.Find(sprites, s => s.name == spritePart.SpriteName) як UnityEngine.Sprite;
				}

				if(spr != null)
				{
					spritePart.Part.GetComponent().sprite = spr;
				}
				spritePart.Part.localScale = spritePart.scale;
			}
		}
	}
}

}

Сценарій довільного налаштування

Я використовую цей скрипт для зміни зовнішнього вигляду персонажа випадковим чином.
використання UnityEngine;
використання System.Collections;

публічний клас RandomCustomizator: MonoBehaviour {

Color32[] SkinColorSet = 
{
	новий колір32 (226, 200, 173, 255),
	новий колір32 (114, 86, 65, 255),
	новий колір32 (204, 179, 138, 255),
	новий колір32 (237, 220, 204, 255),
	новий колір32 (220, 171, 141, 255),
	новий колір32 (253, 180, 155, 255)
};

void OnTriggerEnter2D(Collider2D obj)
{
	MultiSpriteCharacter msc = obj.GetComponent();
	msc.SpriteSet[0].CurrSpriteID = Random.Range(0, 5); //змінити зачіску

	Символ chr = obj.GetComponent();
	chr.HairColor = GetRandomColor();
	chr.SkinColor = SkinColorSet[(int)Random.Range(0, SkinColorSet.GetLength(0))];
	chr.HandColor = chr.SkinColor;
	chr.SkirtColor = GetRandomColor();
	chr.PaintPlayer();
}

Колір GetRandomColor()
{
	Колір Vector3 = новий Vector3(Random.Range(0, 1.0f), Random.Range(0, 1.0f), Random.Range(0, 1.0f));
	color.Normalize();
	повернути новий колір (колір.x, колір.y, колір.z, 1.0f);
}

}

 

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

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