Как сделать пакмана на юнити

Добавил пользователь Евгений Кузнецов
Обновлено: 04.10.2024

Создание 2D змейки в Unity.

Пример создания простой 2D игры змейка (так же известной как snake, slither) в среде Unity.

Дл начала создадим проект 2D. На сцене разместим три спрайта и подпишем Head, BodyPart, FoodItem.

Head - это наша голова, которой мы и будем управлять.
BodyPart - часть тела, которая будет добавляться по мере съедания Food. Так же с добавлением длинны тела, будем менять и скорость.

Если вышли за пределы экрана, респавним в начальной точке и отсекаем часть туловища.

Управление змейкой.

Создадим скрипт SnakeController. Добавим свойство

Массив parts будет содержать наше тело, включая голову. Текущий угол поворота будет в переменной currentRotation. В bodyPart будет префаб с частью туловища. speed и speedRotation будет отвечать за скорость перемещения и поворота соответственно.

В функции Start добавим себя (голову) в массив частей тела.

В функции Update напишем

То есть мы получаем от -1 до +1 значение поворота и умножаем его на время, прошедшее с прошлого обновления и на коэффициент скорости вращения. Для инверсии отнимаем от текущего угла.

Далее используем вспомогательную функцию Quaternion.Euler которая возвращает поворот на заданный угол вокруг каждой из осей. Так как нас интересует только вращения вокруг оси Z, X и Y можно передать 0.

И вызываем Translate для перемещения головы вперед с заданной скоростью с учетом угла поворота указанного выше.

Для управления головой этого уже достаточно.

Создадим еще один скрипт BodyPart.

В свойстве parentObject будет объект за которым будет следовать данная часть тела змейки.

В функции Update с помощью функции LookAt задаем поворот в сторону объекта слежения, то есть предыдущего объекта. И перемещаем наш объект с помощью функции Lerp. Это линейная интерполяция между двумя точками, позицией текущего объекта и объекта за которым движется текущий объект.

То есть движется голова, за ней первый объект BodyPart. Он поворачивается в сторону головы и сдвигается. Если третий параметр 1.0f будет возвращен второй параметр функции Lerp, то есть наш объект переместится в точку где находится голова. Если же передать 0.0f, будет возвращена позиция текущего объекта и он останется на месте.

Таким коэффициент 3.0f немного сожмет части тела змейки чтобы они не были слишком далеко. Умножение на скорость, даст еще большее прижатие с увеличением скорости. То есть чем больше частей, тем больше скорость, тем компактнее они будут.

Еда для змейки

Добавим одноименный тег на объект FoodItem для определения еды. Добавим на объекты Head и BodyPart по Circle Collider 2D. Это нужно для определения пересечения головы и еды. При пересечении коллайдеров будет вызвана функция OnTriggerEnter2D. Но для этого необходимо еще повесить на объект Head компонент Rigidbody 2D. Без него триггер не сработает.

Rigidbody по умолчанию имеет массу и гравитацию, и будет падать вниз экрана, поэтому уберем гравитацию (Gravity Scale) в 0.

При столкновении проверяем ранее заданный тег для еды, если это еда, удаляем объект еды.

Достаем из нашего массива частей тела предыдущую часть, за которой будет следовать новая. И спавним BodyPart в месте где сейчас голова. Задаем нашей новой части тела объект за которым следовать. Так же передадим контроллер головы, для доступа к скорости (цель использования скорости описаны выше). Помещаем наш объект в массив частей тела змеи. И увеличиваем скорость движения змеи для большей сложности.

Добавим скрипт SnakeController на объект Head, а скрипт BodyPart на одноименный объект. Перетянем BodyPart в папку Assets тем самым создав префаб.

На объекте Head в скрипте в свойстве Body Part выберем созданный только что префаб.

Генератор еды для змейки

Создадим префаб FoodItem. В нем можно прописать вес еды и присвоение картинки. В репозитории вы найдете скрипт с заданием случайного спрайта нашему FoodItem.

Создадим скрипт FoodManager .

Свойство foodItem ссылается на префаб FoodItem.

Функция Add добавляет на экран в случайных координатах один объект еды. При старте создаем 7 объектов еды.

Добавим в SnakeController при съедании одного объекта, создание нового в случайном месте.

Объявим новое свойство

В методе Start присвоим ему наш скрипт. Можно повесить сразу на Head скрипт FoodManager. Но я создал пустой объект на сцене, повесил на него скрипт, и задал имя FooManager. Если змеек будет не одна, то два менеджера еды не нужны :)

В функцию Start добавим

В функцию OnTriggerEnter2D после изменения скорости

На этом пожалуй я закончу.

Полный код проекта можно посмотреть по ссылке под видео на канале.

В нем есть проверка выхода за пределы экрана и сброс половины веса а так же спрайты.

Импортирование 2D-ресурсов в Unity

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

1. Подготовка 2D-ресурсов изображений для импортирования в Юнити

Импортирование двумерных ассетов, известных как спрайты, в Unity относительно простой и легкий процесс.

Существует несколько шагов, которые можно предпринять, чтобы сделать импортирование, поиск и использование спрайтов в Юнити намного легче. Хотя их можно сохранять где угодно в основной папке Assets, мы рекомендуем создавать в Assets папку только для спрайтов и в ней размещать подпапки, организованные по сценам, персонажам или любой другой организационной структуре, подходящей для вашего проекта.

Называйте ассеты так, чтобы их назначение было понятным. Такое название, как Title_Screen_Background упростит распознавание, чем, например, названия файлов New Image 27 или Untitled3 . Если спрайт является частью анимации, хорошей практикой будет дать каждому кадру в этой анимации такое же имя, пронумеровав каждый так, чтобы они отображались по порядку в окне Project. Например, может быть двенадцать спрайтов с именами от Player_Barbarian_Walk_North_00 до Player_Barbarian_Walk_North_11 .

Unity может импортировать 2D-ресурсы либо в виде отдельных файлов, где каждый элемент пользовательского интерфейса или кадр анимации представляет собой отдельный файл, либо как множество ресурсов, сгруппированных в одно изображение (часто называемое Sprite Sheet — таблицей спрайтов или Sprite Atlas — атласом спрайтов).

Примечание. Атлас спрайтов — это изображение, содержащее набор непоследовательных спрайтов, в то время как таблица спрайтов — это изображение, содержащие последовательные спрайты, обычно используемые для анимации.
При работе с редактором спрайтов следует учитывать несколько важных моментов. Таблица спрайтов должна иметь размер, равный степени 2 (512 * 512, 1024 * 512, 1024 * 1024 и т.д.), чтобы избежать проблем с таблицами неправильного размера. Также для правильной работы в Unity у таблицы спрайтов должен быть параметр Sprite Mode со значением Multiple. Если установлено значение Single, вы не сможете использовать функции редактора спрайтов.

Один из способов автоматизировать присвоение имен длинным последовательностям кадров анимации — сохранять кадры вместе по порядку в таблице спрайтов, содержащей только эту анимацию.

В приведенном выше примере вы назвали бы изображение Player_Barbarian_Walk_North_ и использовали бы редактор спрайтов, описанный далее в этом рабочем процессе, чтобы автоматически нарезать и присвоить названия спрайтам.

Большинство инструментов анимации могут экспортировать таблицы спрайтов, а их тщательная организация и присвоение имен могут автоматизировать настройку спрайтов в Unity.

2. Импортирование одного спрайта

При импортировании одного спрайта Юнити назовет этот спрайт именем файла изображения. Например, Hamburger.jpg станет Hamburger. Создайте или откройте 2D-проект в Unity и поместите спрайт (Рисунок 1) в окно Project, или где-нибудь внутри Assets используя проводник Windows (или Finder на Mac).

Рисунок 1: Пример спрайта, увеличен для наглядности

Нажмите на только что импортированный спрайт в окне Project, чтобы открыть инспектор для настроек импорта (Рисунок 2).

Настройки импортирования спрайтов в Unity

Рисунок 2: Параметры импорта по умолчанию для спрайтов. Обязательно примените изменения, которые делаете для настроек, нажав на Apply в правом нижнем углу. Если вы забудете это сделать, то Unity предложит применить изменения.

Для большинства задач важны следующие параметры:

Pixels Per Unit: Определяет сколько Unity единиц в размере спрайта. Обычно это число будет одинаковым для всех спрайтов в проекте. В большинстве случаев вы будете выбирать это число перед созданием ассетов, так как этот параметр указывает относительный масштаб спрайтов относительно друг друга, мира, и ортогональной камеры.

Для проектов, использующих изображения с высоким разрешением или не ориентированных на конкретное разрешение, соотношение сторон, или визуальный стиль (например, консольные или компьютерные ретро игры) это число в значительной степени является произвольным.

Этот параметр полезен, если вы создаете игровой мир на основе тайлов; параметр Pixels Per Unit равный размеру одной единицы мира облегчает быстрое построение миров, удерживая клавишу Ctrl (Command на Mac), чтобы двигать их на одну единицу за раз.

Еще одна особенность, которую стоит учитывать при настройке Pixels Per Unit — какая часть мира должна быть видимой на экране. Именно здесь параметр Pixels Per Unit имеет важность вместе с размером (ортогональной) камеры.

Для игры-приключения в стиле ретро можно было бы сделать спрайты 16×16, установив параметр Pixels Per Unit на 16. Размер ортогональной камеры — половина вертикального размера экрана в единица Unity. Чтобы сделать игровой миры высотой 244 пикселей на экране, разделите половину 224 (112) на 16, чтобы получить размер ортографической камеры (в данном случае 7).

Pivot: опору можно рассматривать как точку привязки спрайта. Чтобы сталактит свисал с потолка нужно установить его pivot на значение Top, а его позицию установить как у потолка. Для любого персонажа или элемента декора, который должен стоять на земле, обычно устанавливается значение Bottom. Существует 10 вариантов поворота: любое из трех горизонтальных положений (центр и края) в сочетании с любым из трех вертикальных положений или настраиваемый поворот, указанный в диапазоне 0–1 в обоих измерениях. Центр установлен по умолчанию и подходит для многих целей.

Filter Mode: Определяет визуальное качество спрайтов. Возможные настройки: Point (без фильтра), Bilinear и Trilinear. В режиме Point, вместо интерполяции между исходными пикселями, пиксели повторяются или пропускаются, чтобы спрайт выглядел больше или меньше. Bilinear — это 2D-сглаживание, которое полезно для элементов с высоким разрешением или на основе фотоизображений. Trilinear переходы между MIP-картами, которые обычно не используются для 2D-элементов.

3. Импортирование и настройка нескольких спрайтов в одно изображение при помощи Sprite Editor

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

Создайте или скачайте изображение с несколькими спрайтами и импортируйте его в проект (Рисунок 3).

Настройки для параметра Type следующие:

Automatic: Редактор спрайтов определяет области, которые окружены прозрачностью, и назначает их как спрайты.

Grid By Cell Size: Сетка нарезается равномерно с указанием пользователем размера каждой ячейки. Это наиболее распространенный параметр при построении проектов на основе тайлов, или проекты, в которых большая часть или вся область спрайтов на листе одинакового размера (например, значки или другие унифицированные элементы интерфейса, или строительные блоки игрового мира).

Grid By Cell Count: Сетка нарезается равномерно с указанием пользователем количества строк и столбцов спрайтов. Можно использовать этот параметр вместо Grid By Cell Size, если таблица спрайтов была сгенерирована программой, в которой вы уже определили количество строк и столбцов.

Cell Size: определяется либо Pixel Size, либо количеством Column и Row, в зависимости от того, какой неавтоматический параметр вы выбираете.

Offset: позволяет вам отметить начальный (слева сверху) угол в таблице спрайтов, и бывает полезным в ситуациях, когда спрайты разделены сеткой.

Padding: позволяет указать буфер между спрайтами, опять же, полезно для спрайтов, разделенных сеткой.

Keep Empty Rects: определяет спрайт даже если в нем нет изображения в автоматически сгенерированной области, при нарезке по размеру ячейки или количеству.

Pivot: определяет опорную точку спрайта. Например, спрайт с параметром Pivot, у которого установлено значение Center (по умолчанию), будет центрировано вокруг исходной точки, если для его позиции устанавливаются значения 0, 0, 0.

Установка имени спрайту в таблице спрайтов в Unity

  1. Установите свои настройки и нажмите на Slice.
  2. По умолчанию все имена спрайтов — это комбинации исходного файла изображения и позиции спрайта в последовательности спрайтов (подразумевается порядок чтения слева-направо, сверху-вниз), начиная с 0.
  3. Нажмите на спрайт, чтобы выделить его. Теперь вы можете переименовать его, отрегулировать его позицию и размер, и добавить границы (для 9-нарезки). чтобы узнать больше о том, что такое 9-нарезка, посмотрите Использование 9-Нарезки для масштабируемых спрайтов.
  4. Чтобы создать новый спрайт без использования инструмента нарезки (или после того, как вы его использовали), нажмите где-нибудь на изображении (начиная снаружи любых существующих спрайтов, иначе вы закончите выделение и передвинете спрайт) и перетащите, чтобы создать спрайт.
  5. После выбора вы также можете удалить назначенный спрайт. Обратите внимание, что это не удаляет выбранную часть изображения. Вы также можете перетащить края спрайта, чтобы изменить его размер. Зажмите Ctrl/Command при перетаскивании, чтобы отрегулировать границы спрайта. В данном примере изображения мы удалили спрайты из центральной и нижней части столбца. Затем мы перетащили нижний край верхнего спрайта вниз к нижней части таблицы спрайтов, чтобы сделать весь столбец одним большим спрайтом (Рисунок 8). Рисунок 8: Присвоение спрайтам значимых имен упрощает их поиск в дальнейшем.
  6. Когда закончите, нажмите Apply и закройте окно редактора спрайтов (Рисунок 9).

Вот все, что касается импортирования 2D-ассетов в Unity. Выбранные вами настройки будут во многом зависеть от вашего проекта, и с опытом вы найдете то, что лучше всего вам подходит.

Если вам понравился урок, то вы можете добавить его в закладки социальных сетей (значки снизу), чтобы сохранить новые знания.

Обложка: Пишем сапёр на Unity. Настройка

Логические игры часто включают в себя клеточные поля, при этом клетки имеют определенные свойства и модели поведения. В этой серии уроков мы покажем вам, как создать простую версию классической игры Сапёр. Прилагаем список статей:

  1. Пишем сапёр на Unity. Настройка.
  2. Пишем Сапёр на Unity. Обработка конца игры.

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

Правила игры

Цель игры — найти все мины и не взорваться. Мины спрятаны в клетках, а сами поля бывают разных размеров от 9×9 (легкий уровень) до 16×30 (сложный уровень). Впрочем, никто не запрещает использовать любой понравившийся размер поля.

После того, как все клетки с минами будут отмечены, вы выигрываете. Попробуйте поиграть в это демонстрационное приложение — именно такую игру в результате мы и должны получить.

Базовая клетка

Создайте новый проект Unity, добавьте на сцену кубик (Cube) и назовите его Tile. Перетащите его в папку с проектом для того, чтобы превратить его в префаб. Кубик пока ничего не умеет, но мы воспользуемся им, чтобы построить игровое поле, а затем добавим ему новых возможностей.

Генератор клеток

Создайте новый пустой объект и назовите его Grid. Так же как и кубик, сделайте его префабом (перетащив в папку с проектом). Этот объект — наш будущий генератор клеток, который и будет создавать игровое поле.

Создайте новый сценарий (в качестве языка программирования будем на этот раз использовать JavaScript) и также назовите его Grid. Прикрепите его к нашему генератору и пропишите в скрипте:

Сохраните скрипт и перетащите наш кубик Tile в поле Tile Prefab компонента Script объекта Grid. У вас должно получится вот так:

ms_04

Названия переменных говорящие: numberOfTiles позволяет задать количество клеток на игровом поле, а distanceBetweenTiles задает расстояние между клетками.

В настоящий момент генератор клеток ничего не делает. Давайте добавим несколько строчек кода в метод CreateTiles:

Если вы нажмете на кнопку Play, то увидите нечто подобное:

ms_01

Функция CreateTiles создает копии префаба кубика (столько раз, сколько мы задали) и помещает их в линию, где расстояние между кубиками равно distanceBetweenTiles. Попробуйте подобрать оптимальное расстояние, чтобы будущее поле выглядело красиво.

Но для Сапёра нам нужно поле в виде сетки, а не линии. Чтобы достичь этого, добавьте в сценарий объекта Grid новую переменную, которая будет отвечать за количество кубиков в строке:

public var tilesPerRow: int = 4;

И перепишем метод CreateTiles:

Запустив игру, вы увидите такую картину:

ms_02

Вы наверняка поняли, что значение numberOfTiles должно делиться на tilesPerRow нацело, иначе полученное поле будет неправильным и некрасивым. Но наша реализация игры будет правильно работать и в случае неправильного поля.

Добавление мин

Теперь, когда мы создали основу, давайте поработаем с минами. Создайте новый сценарий, назовите его Tile и прикрепите его к префабу Tile. Добавьте строчку с объявлением переменной:

public var isMined: boolean = false;

Этот параметр нам и скажет, есть ли в клетке мина. Далее нам нужно позволить генератору создавать новый объект, который мы только что создали. Для этого измените тип переменной tilePrefab с GameObject на Tile в скрипте объекта Grid:

public var tilePrefab: Tile;

А теперь добавим новые переменные:

И не забудем про инициализацию:

И немного изменим команду Instantiate:

А в конце сценария выполним метод AssignMines. Вот так будет выглядеть измененный метод CreateTiles:

Метод AssignMines случайным образом задаст некоторым клеткам мины:

Как работает функция AssignMines? Дело в том, что все созданные клетки в методе CreateTiles помещаются в массив tilesAll. И уже в методе AssignMines они копируются в массив tilesUnmined. Далее случайным образом отбирается numberOfMines плиток. Параметр isMined отобранных плиток устанавливается в true, а они сами удаляются из массива tilesUnmined и помещаются в tilesMined.

На данный момент обычные клетки никак не отличаются от тех, которые с минами. Этот момент мы обязательно исправим, но вы уже сейчас можете проверить демо-игру, в которой можете по-своему настроить поле и количество мин (красные кубики).

Дизайн плиток

Сейчас наши клетки выглядят как кубики (по сути это и есть кубики). Давайте изменим их внешний вид.

В исходных файлах вы найдете 3D модель puzzleObjects.fbx. Скопируйте файл в папку с проектом для дальнейшего использования (убедитесь в том, что он импортируется с размером, установленным в 1):

ms_02_01

Перейдите в настройки префаба Tile и поменяйте значение поля Mesh Filter на tileImproved.

И здесь же сбросьте значения компонента Box Collider, нажав на него правой кнопкой мыши и выбрав Reset.

ms_02_03

И наконец, присвойте объекту новый материал, чтобы он не имел стандартный белый цвет.

ms_02_04

Обратите внимание, мы поменяли параметры префаба лишь раз, но изменениям будут подвергнуты все созданные из него объекты. В этом и есть преимущество этих объектов.

Добавление чисел

Для того, чтобы показывать количество мин вокруг открывшейся клетки, воспользуемся 3D текстом. Создайте, выбрав GameObject -> Create Other -> 3D Text, и добавьте его к объекту Tile. Вот, как это должно выглядеть:

ms_02_05

Поверните текст так, чтобы он лежал на клетке, установите значение текста в 0, а его размер измените так, чтобы он не выглядел размытым.

ms_02_06

ms_02_07

Теперь мы должны получить доступ к тексту из кода. Добавьте следующую строчку в скрипт объекта Tile:

public var displayText: TextMesh;

Перетащите объект текста в новое поле компонента Script объекта Tile:

Вывод

И на этом наша статья подходит к концу. Мы создали функциональную основу для игры в жанре головоломок. Эта основа может быть использована вами не только для Сапёра.

В следующей части этой серии мы добавим больше возможностей клеткам и доведем игру до ума. Оставайтесь с нами!

Батюшка показал где был подземный вход в церковь! Здесь никогда не копали! Находки на каждом шагу!

Батюшка показал где был подземный вход в церковь! Здесь никогда не копали! Находки на каждом шагу!

Открытие сезона 2022 Честными копателями

Открытие сезона 2022 Честными копателями

НАШЕЛ МЕТАЛЛОИСКАТЕЛЕМ ДОРОГИЕ СТАРИННЫЕ НАХОДКИ! КОП ЦАРСКИХ МОНЕТ РЕДКИЕ НАХОДКИ МЕТАЛЛОИСКАТЕЛЕМ

НАШЕЛ МЕТАЛЛОИСКАТЕЛЕМ ДОРОГИЕ СТАРИННЫЕ НАХОДКИ! КОП ЦАРСКИХ МОНЕТ РЕДКИЕ НАХОДКИ МЕТАЛЛОИСКАТЕЛЕМ

СОВЕТСКИЕ ТАНКИ М3 LEE / БОЙ С ПАНТЕРАМИ

СОВЕТСКИЕ ТАНКИ М3 LEE / БОЙ С ПАНТЕРАМИ

Фартовый напарник в деле / Лесные Копатели

Фартовый напарник в деле / Лесные Копатели

Недавние находки

Фото приколы - Может быть показалось?

Фото приколы - Может быть показалось?

По сети гуляет масса фото-приколов, смысл которых не понять с первого взгляда. Какие-то из них очень даже безобидные, другие, наоборот из разряда 1.

Находки старинных предметов (фото)

Находки старинных предметов (фото)

Так называемые фарфоровые "ролики" для электропроводки Фото предметов найденных в старом сарае одним. Читать >>>

Немецкие ножи не известного происхождения и еще один странный предмет

Немецкие ножи не известного происхождения и еще один странный предмет

Немецкие ножи кустарного изготовления и другая находкаЭта пара ножей была найдена в Германии на чердаке. Читать >>>

Кинжал полицейского

Кинжал полицейского "Третьего рейха" 1937 года выпуска и другая находка

Это продолжение подборки фото с ценами оружия и других артефактов времен втором мировой войны. Кинжал. Читать >>>

Читайте также: