СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

H Своя змейка, или пишем первый проект. Часть 1 в черновиках

Предисловие


Привет Хабр! С вами Евгений «Nage», и сегодня мы начнем цикл статей, по Змейке в Unity3D. В пилотной статье мы посмотрели как можно реализовать игру в консоли, теперь перейдем к игровому движку.
Статьи будут преследовать 2 цели:
Во первых, для новичков, показать разработку игры от начала и относительно до конца, стараясь написать максимально масштабируемый и поддерживаемый код.
Во вторых, для меня, непрофессионала, получить советы/критику по коду и реализации в целом.
И так, пора начинать:)

Оглавление:
Змейка&Unity Часть 1.

Глава 1. Начало начал


Для работы нам понадобиться: Unity3D 2017.3, любой редактор кода, я предпочитаю Visual Studio 2017, и ваш любимый графический редактор, я использовал бесплатный krita.
Определимся с графикой, я выбрал простой pixel-art, размер изображений 24х24. Поле будет состоять из тайлов, поэтому нам понадобится 2 монотонных изображения, препятствия, например в виде камней, несколько типов еды, голова и тело змеи, и изображение кнопки для интерфейса. После некоторого времени за поиском материала и творчеством получился вот такой набор спрайтов


Теперь посмотрим как нарезать изображение на те самые спрайты в Unity, закинем картинку в новый проект, который мы конечно уже создали. В инспекторе выставляем Filter mode — Point, это фильтр без сглаживания, что бы был виден каждый пиксель спрайта, и Sprite mode — Multiple, значит что наша текстура содержит несколько спрайтов. И так заходим в Sprite Editor

Здесь нажимаем Slice, и выбираем Type — Grid By Cell Size, и выставляем Pixel Size — 24x24

получаем сетку в 24 пикселя, и кнопку разрезанную на 4 части, просто удалим 3 из них и растянем первую на всю кнопку, и получаем все нужные нам спрайты. Стоит сразу переименовать каждый спрайт для удобства.

Глава 2. Обзор местности


Создадим игровое поле, для этого нам нужно создать сетку с тайлами — Create/2D Object/Tilemap. Так же надо создать палитру, что бы открыть окно палитры выберем в меню Window/Tile Palette. Нажимаем Create New Palette — Create, и нас попросят выбрать куда сохранить палитру.

Отлично! Теперь в меню Active Tilemap можно выбрать Tilemap на котором будем рисовать.
Перетащим спрайт из нашей текстурки в палитру, и нам предложат сохранить тайл.

Теперь можно рисовать тайлами по сетке, сделаем это в шахматном порядке.
Напишем маленький класс Bound, который будет считать границы нашего поля
using UnityEngine;
using UnityEngine.Tilemaps;

public class Bound : MonoBehaviour {
    [SerializeField] private Tilemap tile;
    private BoundsInt bounds;
    public static int Right;
    public static int Left ;
    public static int Up   ;
    public static int Down ;
    private void Awake() {
        bounds = tile.cellBounds;
        Right = bounds.size.x + bounds.position.x - 1;
        Left  = bounds.position.x;
        Up    = bounds.size.y + bounds.position.y - 1;
        Down  = bounds.position.y;
    }
}

В инспекторе вешаем скрипт на Grid и перетаскиваем наш Tilemap в поле, теперь можно пользоваться значениями, например для пределов где спавнится еда.
Важно!
На данный момент Tilemap работает плохо, сразу рисуйте поле в нужный размер, а то значения будут не верными, если вы поставите лишний тайл и потом удалите его. cellBounds возвращает размеры прямоугольника, который когда либо существовал.
Например, вы нарисовали поле 5х10, и случайно поставили лишний квадратик в точке (0,-1), а потом удалили его. И было бы логично предполагать, что метод вернет координаты (0,0) и размер 5х10, но нет, он вернет (0,-1) и 5х11.


Глава 3. Главное меню


Сохраним сцену под названием LvL0, и создадим новую, для главного меню. Нам понадобится просто beckground и 2 кнопки, «New game» и «Exit». Должно получиться что то такое

напишем класс для этих кнопок
using UnityEngine;
using UnityEngine.SceneManagement;

public class ButtonManager : MonoBehaviour {
    public void LoadScene(string newGameLvl) {
        SceneManager.LoadScene(newGameLvl);
    }
    public void ExitBtn() {
        Application.Quit();
    }
}

тут все просто, один метод загружает сцену по ее названию, второй метод закрывает приложение. Вешаем скрипт на Canvas, затем в кнопке, в блоке On Click() нажимает + и перетаскиваем Canvas в место для объекта. В правом выпадающем меню выбираем метод. Для New game выбираем LoadScene и вписываем название нашей сцены LvL0, для Exit выбираем ExitBtn.

Заключение


Маленькая подготовительная часть закончена, сделали графику игры, основное поле действия и меню. В следующей статье сделаем главную часть — саму змею. Всем удачи :)

комментарии (1)

+3
nkozhevnikov ,   * (был изменён)
Змейка на Unity — это несерьезно.
То же самое можно набросать за час при вкуривание туториалов. Тем более, статья вообще выглядит слишком маленькой.

Уберите статью в черновики, пока минусов не нахватали и доработайте. Слишком мало.