По платформерам на Unity руководств много, а вот качественных не то что бы и очень. Сегодня мы попробуем добавить в копилку хороших уроков еще один. А создавать мы будем персонажа для 2D-платформера, ни больше, ни меньше. Присоединяйтесь, учитесь, но помните: под катом очень много гифок.

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

Итак, с чего начать создание персонажа? Конечно же, с его спрайта. Достаточно перетащить картинку из любой папки на жестком диске во вкладку Assets, а оттуда — прямо на сцену. Оговорюсь сразу, в этом уроке мы не будем рассматривать создание анимации. А вот в следующих частях цикла — будем.

9c479322e8214d6caba243495b6643ed

Как видите, после добавления на сцену (условимся, что это полноценный аналог словосочетанию scene view) у спрайта появились два компонента. Первый — transform. Он отвечает за расположение любого игрового объекта на сцене, его масштаб и текущий угол поворота относительно осей. Компонент sprite renderer как раз занимается отрисовкой спрайта нашего обаятельного носача в процессе редактирования и игры.

2961f0ad50d549529e1ceb9d2ce7fd6c

Но пока персонаж всего лишь картинка, он не может взаимодействовать с окружающим его миром. Для этого на помощь приходят компоненты, спрятанные во вкладке physics2d. В нашем случае это box collider и circle collider. Первый мы добавим на верхнюю часть персонажа для столкновений со стенами и всем остальным, а второй расположим на уровне ног. Это позволит двигаться по наклонным поверхностям (и поверхностям с небольшим перепадом высот) без особых проблем.

1f3280c80eb843cc9413dca072ef2a18

Теперь, чтобы на героя действовала, допустим, гравитация, добавим ему rigidbody2D (ну или твердое тело, как вам больше нравится). Для этого все в том же меню add component -> physics2D выберем пункт rigidbody2D и к спрайту сразу же добавится еще один компонент.

c0eb764799ad4bda858c667ce521b7a8

Если вкратце:

mass отвечает понятно за что;

linear drag и angular drag — линейное и угловое сопротивление, соответственно;

gravity scale — коэффициент гравитации для конкретно этого объекта;

fixed angle отключает переворот персонажа при столкновении с чем-нибудь, допустим, летящим;

isKinematic фиксирует объект раз и навсегда в одной точке;

interpolate устанавливает режим сглаживания при отрисовке персонажа;

Для платформера стандартное значение гравитации (-9.81 по оси Y) не очень подходит, поэтому изменим его на какое-нибудь магическое число. Например, -30. Для этого зайдем в Edit — Project Settings — Physics2D и заменим нужное значение в инспекторе.

f62a9ccded6d40d990cb7673091142dd

На этом пока перестанем добавлять персонажу компоненты. Но сделаем кое-что из него. Для того, чтобы нам не приходилось тысячу раз добавлять одинаковые компоненты на каждом, допустим, уровне, в Unity есть механика под названием prefabs. Она позволяет создать из игрового объекта «болванку», которую можно использовать много раз и менять как своей душе угодно, не боясь за то, что какие-то экземпляры могут не измениться. Для создания префаба достаточно просто перетащить объект из иерарахии во вкладку assets. В моем случае еще и в папку prefabs.

42cbc00f52c44803ac199838505a7c92

Как видите, оба экземпляра героя прекрасно создаются и существуют вместе. Теперь нужно создать платформу, на которой будет стоять наш большеносый друг. Перетащим спрайт на сцену и добавим ему polygon collider. Размеры этого коллайдера, к слову, можно менять, перетаскивая его вершины с зажатой кнопкой shift.

38e1bb6ce7c04a9098d464142fd46348

Самое время научить персонажа двигаться. Перетащим заранее подготовленный

using UnityEngine;
using System.Collections;

public class characterController : MonoBehaviour {
    public float maxSpeed = 10f;
    public float jumpForce = 700f;
    bool facingRight = true;
    bool grounded = false;
    public Transform groundCheck;
    public float groundRadius = 0.2f;
    public LayerMask whatIsGround;

    public float move;

    // Use this for initialization
    void Start () {

    }
    
    // Update is called once per frame
    void FixedUpdate () {


        grounded = Physics2D.OverlapCircle (groundCheck.position, groundRadius, whatIsGround);

        move = Input.GetAxis ("Horizontal");

    }

    void Update(){
        if (grounded && (Input.GetKeyDown (KeyCode.W)||Input.GetKeyDown (KeyCode.UpArrow))) {

            rigidbody2D.AddForce (new Vector2(0f,jumpForce));
        }
        rigidbody2D.velocity = new Vector2 (move * maxSpeed, rigidbody2D.velocity.y);
        
        if (move > 0 && !facingRight)
            Flip ();
        else if (move < 0 && facingRight)
            Flip ();



        if (Input.GetKey(KeyCode.Escape))
        {
            Application.Quit();
        }

        if (Input.GetKey(KeyCode.R))
        {
            Application.LoadLevel(Application.loadedLevel);
        }


    }
    
    void Flip(){
        facingRight = !facingRight;
        Vector3 theScale = transform.localScale;
        theScale.x *= -1;
        transform.localScale = theScale;
    }       
}

 

(его нужно сохранить в папку assets) прямо на персонажа в hierarchy view.

e902463464254cff99178154ca370a0f

c7acde54c1e544f08b35bdefb055352a

У этого кусочка кода есть ряд параметров, которые отвечают за поведение героя в игре.

maxSpeed и JumpForce — максимальная скорость (по горизонтали) и сила прыжка. Экспериментально проверено, что для массы, равной единице, и гравитации -30 значения maxSpeed=10 и jumpForce = 700 являются оптимальными.

groundCheck — дочерний объект, находящийся в нижней точке спрайта и отвечающий за определение того, находится ли нечто, чем мы управляем, на «земле»

whatIsGround — что, собственно, считать землей. В нашем случае «землей» считается все, кроме персонажа

groundRadius — некая величина, в пределах которой проверяется столкновение с поверхностью.

В итоге, строчка grounded = Physics2D.OverlapCircle (groundCheck.position, groundRadius, whatIsGround); проверяет, пересекает ли groundCheck с радиусом groundRadius поверхность и, допустим, запрещает прыгать в нужных случаях.

e822a75ff065418f89d9c6cdfc354462

Давайте, наконец, запустим игру и посмотрим что же у нас сегодня получилось. Для этого нажмем кнопку Play в верхн… Да ладно, вы и сами это разглядели 🙂

632c951c2aba49f7b73e7bcff8dcebe4

 

Герой прекрасно двигается (хотя, возможно, и не совсем прекрасно), и это создает для нас отличные предпосылки продолжить создание платформера.

А в следующей части мы разберемся как управлять камерой, узнаем кому нужно зажигание звезд и создадим самого первого врага. И да, попутно исправим один критический баг, беспечно пропущенный в статью во время этого урока. Догадаетесь, какой?

Ниже исходники платформы и героя

b0672bf5a53a46a3b453523ef4de09cc  31a96ef1cb2d4b51a27e090101143dc6

 

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

Комментарии

comments powered by Disqus