Как сделать изометрическую камеру в unity

Обновлено: 08.07.2024

Я пишу мобильную игру, которая динамически генерирует 3D-элементы на холсте.

Тем не менее, я борюсь с 2 вещами:

  1. Масштаб базовой плоскости должен соответствовать размеру экрана.
  2. Сдвиньте камеру так, чтобы она двигалась прямо над плоскостью и смотрит вниз на объектах.

Поэтому меняем сцену примерно так: ИГМ444

Что-то вроде этого:

Буду признателен за подсказки о том, на какой материал смотреть!

Таааак. ты же знаешь, где находится средний куб, да? Почему бы не расположить камеру на [position of middle cube] + Vector3.Up * [arbitrary distance] ?

Draco18s no longer trusts SE

@Draco18s Спасибо за это! Это на самом деле будет работать для позиционирования камеры. Что касается самолета, то как его можно подогнать под размер экрана мобильного устройства? Это расчет, основанный на поле зрения камеры?

Я нашел ответ на масштабирование холста с помощью Screen.width и Screen.height - теперь мне просто нужно понять, как его центрировать.

Вы можете просто установить цвет скайбокса.

Draco18s no longer trusts SE

gradlew setupDecompWorkspace and gradlew eclipse - это то, что я искал. Тогда не знаю, что произошло.

''), array("string" => ''), ); if (!isset($_COOKIE['rek'])) < print($banners[$GLOBALS["banner_num"]]["string"]); >elseif ($_COOKIE['rek'] == "rek1") < print($banners[0]["string"]); >elseif ($_COOKIE['rek'] == "rek2") < print($banners[1]["string"]); >?>

Как создать свою первую игру в Unity

Обновление (27.08.2014) : добавил видео с показом новых крутых возможностей Unity 5, а также видео, которое поможет вам при создании 2D игры в Unity.

Вот это круто! Это подробная видео инструкция (состоящая из десяти видеоуроков) о том, как создать свою изометрическую 3D стрелялку в Unity.

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

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

Если вам были непонятны какие-то моменты, задавайте вопросы в комментариях.

Обновление 27.08.2014

Кстати, если вы решили создать 2D игру в Unity, то видео ниже поможет вам во многих аспектах (от создание 2D персонажа со скелетом до синхронизации звуков с анимационными событиями):

Обновление 26.08.2014

Физика PhysX 3.3 в новой версии движка Unity 5:

  • Транспортные средства.
  • Ткань (InteractiveCloth и SkinnedCloth). Правда, просчёт ткани силами видеокарты появится только в Unity 5.X
  • Улучшенная многопоточность.

Если хотите узнать, что еще крутого добавят в Unity 5 читайте вот эту статью.

Реклама на 3dyuriki: вот такие видеоуроки на основе полноценного демо-проекта - это не единственный способ учить Unity. Можно также купить курсы unity3d. Преимущество таких курсов в том, что у вас появляется живое общение с преподавателем и другими учениками и вы можете задать вопрос, который вам поможет лучше понять логику (структуру) движка.

Подпишитесь на обновление блога (вот 3 причины для этого).

Похожие статьи:


Вам понравилась статья ? Хотите отблагодарить автора? Расскажите о ней друзьям.
Или подпишитесь на обновление блога по E-Mail.



Короче, с такой проекцией единственный юзабельный способ – несколько комнат, связанных между собой телепортами в виде лестниц и/или дверей (вместо лестниц могут быть двери лифта и вообще что угодно, что в реальности умеет перемещать с этажа на этаж). Когда игрок наступает на лестницу, его телепортирует на другой этаж (вверх/вниз). Этажи не обязательно должны быть разделены на разные "карты" (в терминах движка), т.е. они могут физически находиться в пределах одной карты, но при этом где-то за пределами видимой области. Правда, из-за разницы в разрешениях дисплея у разных игроков лучше делать именно отдельные карты, но тогда подгружать необходимые тайлы/объекты заранее.

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

Другое дело, что если мы делаем много этажей, снаружи появляется большая слепая/мёртвая зона, где мы ничего не можем разместить и куда игрока не всегда разумно пускать (ну тип заблудится или столкнётся с агрессивным мобом). Поэтому в играх на том же RPG Maker обычно не делают здания выше 1-2 этажей. В общем не думаю, что стоит слишком много этажей мудрить.

О, кстати, если делаешь что-то в современном сеттинге, идея: лифт можно сделать дополнительной мини-комнатой (возможно без передней стенки, а можно и скрыть персонажа дверью), в которой игрок может выбрать нужный этаж с помощью цифровой панели на экране или цифровых кнопок клавиатуры. Тогда единственный телепорт на каждом этаже смещает игрока в комнату "лифт", а из этой комнаты игрок выбирает направление телепорта в зависимости от желаемого этажа. Правда, мудрить такое ради 3-4 этажей смысла вроде нет, а пилить 9-этажку в top-down проекции, как я писал выше, слишком затратно по юзабельному пространству основной карты. Но решать тебе)

UPD: Так-то сильная многоэтажность может быть очень кстати для подземелий, подвалов и бункеров. Снаружи имеем только вход, а "под землёй" мы можем расположить сколько угодно этажей, которые снаружи никак не будут видны. Смысл тот же – куча телепортов туда-сюда, но с помощью грамотного левел-дизайна можно создать ощущение погружения на глубину.


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

В прошлый раз мы применили Шум Перлина в качестве основы для генерации поверхности. Этот подход позволяет довольно легко и быстро получить приближённую к реальности карту высот, а добавление цветов в зависимости от высоты делает её похожей на реальную карту. Следующим шагом является использование карты высот для задания собственно самих высот и построение при их помощи объёмного пространства.

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

Тайловые карты

В 2017 году Unity добавила в движок возможность работы с 2d тайлами, что определённо упростило создание топ-даун и сайд-скроллеров. Годом позже также добавили шестиугольные тайлы и изометрические карты, применение которых вызывает большой интерес, ведь шестиугольники давно является основой для серии Civilization, а изометрический вид является базовым для большинства представителей жанра RPG =) Так что попробуем сделать первый шаг в сторону своей ролевой игры и перенести сгенерированную с помощью Шума Перлина карту в изометрическое пространство.

Отобразить сгенерированную Шумом Перлина карту высот при помощи изометрической тайловой карты Unity.

Подготовка

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

Для отображения поверхностей использовался ассет с тайлами от Devil’s Work.shop, из которых были выбраны девять подходящих под требования уровней высот.

Настройка работы с изометрическими картами довольно специфический процесс, который очень хорошо описала Alice Hinton-Jones в своей статье Isometric 2D Environments with Tilemap, так что не имеет смысла её переписывать.

Перечислим шаги, которые были проделаны для настройки данного проекта:

  1. Выставить тип сортировки прозрачности Edit > Project Settings > Graphics > Camera Settings > Transparency Sort Mode - Custom Axis
  2. Настроить оси сортировки прозрачности Edit > Project Settings > Graphics > Camera Settings > Transparency Sort Axis - X=0 Y=1 Z=-0.289 - Z зависит от размеров тайла и алгоритм её вычисления можно прочитать в статье Alice. Возьмите размер вашего объекта Grid по шкале Y, умножьте на 0.5 и вычтите 0.01
  3. Импортировать ассеты тайлов как текстуры
  4. Выставить им Pixels Per Unit в 863 - реальный размер тайла в текстуре
  5. Выставить Pivot в 0.4921, 0.7452 - по центру верхней грани тайла, как описывается в статье от Alice
  6. Разрешить Чтение/запись текстуры в тестовых целях
  7. Создать объект Isometric Z as Y tilemap
  8. Выставить в объекте Grid Y Cell size в 0.577 - зависит от размеров тайла, правила вычисления в статье Alice. Для определения корректного значения шкалы Y возьмите высоту основания(или верхней грани) ваших тайлов и разделите их на ширину
  9. Создать изометрическую палитру тайлов с Y Cell Size в компоненте Grid также равным 0.577
  10. Изменить настройку батчинга в компоненте Tilemap Renderer > Mode на Individual . Эта настройка позволит обойти баг расчёта перекрытия тайлов друг с другом, в случае, если текстуры тайлов находятся в разных атласах. Для использования опции Chunk необходимо, чтобы текстуры тайлов были запечены в один атлас, что можно проделать на стадии подготовки продакшн билда.

Шум Перлина

Генератор шума из прошлой статьи не требует каких-либо доработок и полностью перекочевал из прошлой статьи

Предпросмотр

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

NoiseMapEditorGenerate - добавление кнопки генерации тестовой текстуры в редактор объекта отвечающего за создание тайловой карты(подробнее о расширении редактора Unity можно почитать в нашей статье):

NoiseMapRenderer - класс отвечающий за создание цветной текстуры из Шума Перлина, который позволяет легко настроить параметры и протестировать результаты работы генератора без перехода в Play Mode:

Генерация изометрии

Для изометрической карты был выбран способ выставления высоты через Z компоненту, что позволило избежать создания дополнительных объектов тайловых карт, с целью дифференциации высоты. По сравнению с предыдущей статьёй шкала высот была равномерно распределена, что также дало неплохой, с визуальной точки зрения, результат и сократило время на заполнение шкалы уровней поверхности.

Результат

Open Test Runner

Тестовая текстура сгенерированной карты выглядит так:

Open Test Runner

Сгенерированная из этих же координат изометрическая карта:

Open Test Runner

Open Test Runner

Для придания большей правдоподобности, все уровни воды и первый уровень песка выровнены между собой.

Заключение

Базовое использование тайловых карт не представляет из себя большой проблемы. Но не стоит забывать, что для приведения карты к визуально приемлемому уровню потребуется очень много работы с ассетами. Да и работа с самими картами в нашем примере далека от завершения. Необходимо добавить возможность увеличения высотности карты, что потребует заполнения свободного пространства при перепадах высот больше 2z . Для свободного перемещения необходимо добавить систему блочной загрузки карты. Добавление динамических объектов потребует создания системы перемещения с учётом перепадов высот, возможно, с использованием стандартных коллайдеров. А для визуального улучшения также необходимо проработать механизм стыка тайлов с разными типами поверхностей. Всеми этими вопросами мы займёмся в следующих статьях цикла о процедурной генерации. Пока! =)

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