Про створення платформера на Unity. Частина друга, зоряна

Привіт, Хабр!

Я, як і обіцяв, продовжую ділитися з вами знаннями, набутими в процесі освоєння 2D-режиму Unity. Від початківця, так би мовити, початківцям. Систематизую, покращую і прогресую разом з вами. Сьогодні ми додамо до вмісту першої статті керування камерою, збір бонусів і перший спосіб померти в грі. Якщо вам, як і мені не терпиться приступити, то ласкаво просимо під кат.

І так, гифок там ще більше, ніж в минулий раз.





Скоріше в бій!

Щоб камера під час гри не стояла статично, а плавно рухалася за персонажем, використовуємо заздалегідь підготовлений скрипт. Все як і раніше просто: беремо його і перетягуємо, але вже на камеру.



Сам скрипт дуже короткий і виглядає ось так:

using UnityEngine;
using System.Collections;

public class newcam : MonoBehaviour {
public float dampTime = 0.15f;
private Vector3 velocity = Vector3.zero;
public Transform target;

// Update is called once per frame
void Update () 
{
if (target)
{
Vector3 point = camera.WorldToViewportPoint(new Vector3(target.position.x, target.position.y+0.75f,target.position.z));
Vector3 delta = new Vector3(target.position.x, target.position.y+0.75f,target.position.z) - camera.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, point.z)); //(new Vector3(0.5, 0.5, point.z));
Vector3 destination = transform.position + delta;


transform.position = Vector3.SmoothDamp(transform.position, destination, ref velocity, dampTime);
}

}
}


Main camera, на яку повісили цей скрипт, слід за об'єктом, який вказаний у нього (скрипта) в публічній змінної target. До речі — всі публічні змінні в скриптах можна змінювати прямо з редактора Unity. У нашому випадку вкажемо на хороброго носатого героя, запустимо гру і перевіримо.



Тепер можна зробити префаб з платформи (пам'ятаєте як? якщо ні, дивіться першу статтю) і розкидати їх по сцені довільним чином. У моєму випадку, виглядати це буде приблизно так:



Прогуляємося по рівню. Стрибок, ще стрибок… Невдалий рух і герой падає в яму і не збирається повертатися назад. Як нам з цим боротися? Так легко! Основна ідея в тому, що в порожнечі під платформами будуть розташовані невидимі об'єкти, при перетині яких можна буде завантажити рівень заново або повернути персонажа тому з, припустимо, мінус одного життя. Для цього нам знадобляться порожній об'єкт, якому додамо Box Collider (витягнутий по горизонталі) і поставимо на ньому в інспекторі галку Is trigger. Тригер Unity відрізняється від простого коллайдера тим, що він не є перешкодою, але при перетині з об'єктом може викликати якусь подію. Об'єкт перейменуємо в dieCollider і напишемо трохи коду для обробки падіння. Ось вам гифка з нагоди такого довгого абзацу:



Як можна швидше знайдемо у вкладці Assets і, після подвійного кліка, вперше познайомимося з MonoDevelop в рамках цієї серії уроків.



Для обробки перетину з тригером використовується функція OnTriggerEnter2D. Для простого коллайдера аналогічно OnCollisionEnter2D.
Додамо наступний код:


void OnTriggerEnter2D(Collider2D col){
if (col.gameObject.name == "dieCollider")
Application.LoadLevel (Application.loadedLevel);
}


Як бачите, все логічно. Якщо ім'я об'єкта, з яким ми зіткнулися, збігається з рядком «dieCollider», то перезавантажуємо рівень цілком очевидним методом — завантажуємо ще раз рівень, який вже завантажений.
Тепер можна впасти в яму і…



Відмінно, персонаж повертається на стартову позицію. Зробимо префаб з dieCollider'а, розставимо його копії в усіх небезпечних місцях і оглянемося: чогось явно не вистачає. Звичайно, бонусів, які можна збирати! Принцип їх створення абсолютно аналогічний створення областей, які повертають нас назад. Ми будемо знову використовувати тригери, тільки тепер будемо стикатися не з невидимим об'єктом, а з цілком конкретною зіркою. Працює це так:



Тепер повернемося до MonoDevelop і напишемо трохи коду. Оголосимо float змінну score (яку на перший час можна зробити публічною, щоб стежити за результатом в процесі створення гри) і додамо наступний код в функції OnTriggerEnter2D


if (col.gameObject.name == "star") {
score++;
Destroy (col.gameObject);
}


Він виконує дві прості функції — збільшує результат на одиницю і знищує об'єкт, з яким ми зіткнулися (в даному випадку зірку). Так як бонус ми вже зробили префаб, раскидаем трохи по рівню і подивимося що буде, якщо їх збирати. Зверніть увагу на змінну score в правому нижньому кутку екрану.



Тепер давайте навчимося відображати результат на екрані, адже ніхто не хоче грати в гру прямо в редакторі і дивитися десь збоку кількість зібраних зірок. В цьому нам допоможе функція OnGUI(), яка чудово вміє перетворювати на екрані текстові блоки, кнопки та інші корисні речі.


void OnGUI(){
GUI.Box (new Rect(0, 0, 100, 100), "Stars: " + score);
}


Простіше нікуди. Прямо на ДжиЮАе малюється квадрат з координатою лівого верхнього кута (0,0) і розмірами 100x100. У ньому виводиться текст, прямо говорить нам про кількість зібраних зірочок.



Ось так. За підсумками двох уроків ми навчилися створювати ігрове оточення, додали в гру бонуси, можливість померти і почати заново. Наступного разу я покажу вам як зробити декілька рівнів і змусити нашого персонажа кидатися чим-небудь, у що-небудь. Але цього, безумовно, мало. Тому додамо трохи інтерактивності у наш з вами навчання: голосуйте в прикріпленому опитуванні і я обов'язково додам щось на обрану вами тему.

І так: нагадаю, що прямо зараз проходить конкурс розробників ігор, в якому можна взяти участь і отримати Xbox One або Lumia 930!

Stay tuned!

Попередня частина

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.