Я, как и обещал, продолжаю делиться с вами знаниями, приобретенными в процессе освоения 2D-режима Unity. От начинающего, так сказать, начинающим. Систематизирую, улучшаю и прогрессирую вместе с вами. Сегодня мы добавим к содержимому первой статьи управление камерой, сбор бонусов и первый способ умереть в игре. Если вам, как и мне, не терпится приступить, то добро пожаловать под кат. И да, гифок там еще больше, чем в прошлый раз.

Внимание!!! Много трафика!!!

503c09e18486424baef1bd56d324fbd4

Скорее в бой!

Чтобы камера во время игры не стояла статично, а плавно двигалась за персонажем, используем заранее подготовленный скрипт. Все по-прежнему просто: берем его и перетаскиваем, но уже на камеру.

b82b3ae8d0794978a1fad7e35147f1b2Сам скрипт очень короткий и выглядит вот так:

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. В нашем случае укажем на храброго носатого героя, запустим игру и проверим.

1cb613469cea46058302b0f1c0400c9e

Теперь можно сделать префаб из платформы (помните как? если нет, смотрите первую статью) и раскидать их по сцене произвольным образом. В моем случае, выглядеть это все будет примерно так:

789eea684fd94154bc333814dd44313f

Прогуляемся по уровню. Прыжок, еще прыжок… Неудачное движение и герой падает в яму и не собирается возвращаться назад. Как нам с этим бороться? Да легко! Основная идея в том, что в пустоте под платформами будут расположены невидимые объекты, при пересечении которых можно будет загрузить уровень заново или вернуть персонажа назад с, допустим, минус одной жизнь. Для этого нам понадобятся пустой объект, которому добавим Box Collider (вытянутый по горизонтали) и поставим на нем в инспекторе галку Is trigger. Триггер в Unity3D отличается от простого коллайдера тем, что он не является препятствием, но при пересечении с объектом может вызвать какое-то событие. Объект переименуем в dieCollider и напишем немного кода для обработки падения. Вот вам гифка по случаю такого длинного абзаца:

0088322df4354e06824775d721d95240

Как можно быстрее найдем во вкладке Assets и, после двойного клика, впервые познакомимся с MonoDevelop в рамках этой серии уроков.

c03effdf06a74597bd8ec8ff6dc47554

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

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

Как видите, все логично. Если имя объекта, с которым мы столкнулись, совпадает со строкой «dieCollider», то перезагружаем уровень вполне очевидным методом — загружаем еще раз уровень, который уже загружен.

Теперь можно упасть в яму и…

e6150dd57b004704876f2d52a5390fa9

Отлично, персонаж возвращается на стартовую позицию. Сделаем префаб из dieCollider’а, расставим его копии во всех опасных местах и осмотримся: чего-то явно не хватает. Конечно, бонусов, которые можно собирать! Принцип их создания абсолютно аналогичен созданию областей, которые возвращают нас назад. Мы будем снова использовать триггеры, только теперь будем сталкиваться не с невидимым объектом, а со вполне конкретной звездой. Работает это так:

12498b96b61b4b11ade23e38ea2932da

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

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

Он выполняет две простые функции — увеличивает результат на единицу и уничтожает объект, с которым мы столкнулись (в данном случае звезду). Так как из бонуса мы уже сделали префаб, раскидаем немного по уровню и посмотрим что будет, если их собирать. Обратите внимание на переменную score в правом нижнем углу экрана.

91dfa78c00c04285b3a5f0946ba50919

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

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

Проще некуда. Прямо на ДжиЮАе рисуется квадрат с координатой левого верхнего угла (0,0) и размерами 100x100. В нем выводится текст, прямо говорящий нам о количестве собранных звездочек.

74de8bc6a33d40e2b9353540389c53ef

Вот так. По итогам двух уроков мы научились создавать игровое окружение, добавили в игру бонусы, возможность умереть и начать заново. В следующий раз я покажу вам как сделать несколько уровней и заставить нашего персонажа бросаться чем-нибудь во что-нибудь. Но этого определенно мало. Поэтому добавим немного интерактивности в наше с вами обучение: голосуйте в прикрепленном опросе и я обязательно добавлю что-то на выбранную вами тему.

 

Взято из блога Microsoft с хабра

Комментарии

comments powered by Disqus