Реализуйте обнаружение попаданий с помощью тайловых карт

Страница обновлена :
Дата создания страницы :

Среда верификации

Виндоус
  • Windows 11
Редактор Unity
  • 2021.3.3f1
Входной системный пакет
  • 1.3.0

Предпосылки для этого совета

Следующие настройки были сделаны заранее в качестве предпосылки для описания этого совета.

Каковы предпосылки для этого совета?

О заимствовании картографических материалов

Мы обрабатываем заимствованные со следующих сайтов.

Реализация ходячих персонажей

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

Если вы хотите реализовать анимацию ходьбы, ознакомьтесь со следующими советами:

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

Выберите изображение и установите для параметра «Пиксели на единицу» значение 32 в инспекторе. Это связано с тем, что размер одного квадрата картографического чипа составляет 32 пикселя, поэтому он подходит для этого. После настройки нажмите кнопку «Применить» ниже.

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

Создайте сценарий для перемещения спрайта. Это похоже на следующие советы:

Оставьте имя Player скрипта как .

Код следующий:

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // キーボードの情報を取得
    var keyboard = Keyboard.current;

    // スプライトの移動処理
    if (keyboard.leftArrowKey.isPressed)
    {
      transform.Translate(-0.1f, 0, 0, Space.World);
    }
    if (keyboard.rightArrowKey.isPressed)
    {
      transform.Translate(0.1f, 0, 0, Space.World);
    }
    if (keyboard.upArrowKey.isPressed)
    {
      transform.Translate(0, 0.1f, 0, Space.World);
    }
    if (keyboard.downArrowKey.isPressed)
    {
      transform.Translate(0, -0.1f, 0, Space.World);
    }
  }
}

Прикрепите к спрайту, который хотите переместить.

Запустите игру и проверьте, хотите ли вы перемещать ее с помощью клавиатуры.

Подготовка MapTips

Первым делом подготовим мапчип и создадим карту. Эта процедура аналогична следующим советам: MapTips с 2D Tilemap Extras также способны обнаруживать столкновения, но они не будут использоваться в этой статье, потому что процедура будет долгой.

Подготовьте исходный образ MapTip и добавьте его в свой проект. Чтобы сделать операцию более понятной, пожалуйста, подготовьте «проходимое место» и «непроходимое место» для материала чипа карты.

Настройте его для MapChips в инспекторе и нажмите кнопку «Применить». После настройки откройте редактор спрайтов.

Это 32-пиксельная подсказка, поэтому я разделю ее на 32.

Перейдите на вкладку Палитра плиток. Если нет, отобразите его с помощью «Window > 2D -> Tile Palette» в меню. Создайте новую палитру. Название произвольное, но пока мы будем называть его «MapChipPalette».

Создайте папку MapChipPalette в Scenes и укажите ее.

Добавьте подсказку карты, перетащив ее на палитру. Сохраните его в папке MapChipPalette, созданной ранее.

Создание карты

На этот раз оценка попаданий по карте будет производиться в единицах «Tilemap». Поэтому мы создадим две тайловые карты: «Тайловая карта без обнаружения попаданий» и «Тайловая карта с обнаружением попаданий».

Во-первых, создайте две тайловые карты в иерархии. Вы можете создать два в сетке. Для ясности используются имена «TilemapObeject» и «TilemapGround».

Во-первых, создайте «TilemapGround». Поскольку это подвижный диапазон, вы можете просто уложить землю. Если он находится на земле, можно изменить рисунок.

Кстати, если символ скрыт, выделите объект-символ и установите порядок слоев инспектора Sprite Renderer на 2. По умолчанию порядок слоев равен 0, а Tilemap — 0, поэтому, если вы увеличите его выше этого значения, он будет отображаться на переднем плане.

Затем выберите TilemapObject и поместите подсказку, которую вы хотите сделать неподвижной. Сначала установите порядок слоев на 1. Это делается для того, чтобы он появился перед землей.

Вот как это выглядит, если скрыть землю.

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

Настройки обнаружения столкновений

Во-первых, давайте настроим персонажа. Эта настройка почти такая же, как и советы ниже, поэтому я пропущу детали и кратко объясню процедуру.

Выберите объект-символ из иерархии и выберите Физика 2D -> Кольцевой коллайдер 2D в разделе Добавить компонент. Если форма объекта прямоугольная, «Box Collider 2D» подойдет.

Точно так же добавьте «Физика 2D > Жесткое тело 2D».

Установите шкалу силы тяжести на 0, чтобы предотвратить Rigidbody 2D автоматическое падение.

Отметьте Z в разделе «Ограничения», чтобы предотвратить вращение спрайта при столкновении.

Затем выберите «TilemapObject», который вы хотите нажать, и выберите «Tilemap -> Tilemap Collider 2D» в «Добавить компонент».

Вот и все. Вам даже не нужно никакого программирования. Запустите игру и постарайтесь попасть в объект, который становится стеной. Я думаю, вы можете убедиться, что он останавливается правильно.

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

Неудобное поведение обнаружения попаданий с картой и решениями

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

Если вы прижметесь к стене, вы попадете посередине

Box Collider 2D Я думаю, что это произойдет, если вы используете объект.

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

Распознавание вмятин на стенах по положению

Circle Collider 2D Думаю, это легко понять, если прикрепить. Стена должна быть плоской, но если вы придвинете ее к стене, вы увидите, что стена движется так, как будто она неровная.

Причины и решения проблем и неровностей

Причина, по которой это происходит, по-видимому, заключается в том, что «определение попадания выполняется на основе картографа». Фактически, когда вы выбираете TilemapObject, в том месте, где находится обнаружение попадания, появляется зеленая линия, и вы можете видеть, что это линия, нарисованная в единицах MapTip.

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

Я думаю, что лучший способ решить эту проблему - объединить обнаружение попаданий с прикрепленными картографическими чипами. Вот как это сделать:

ВыберитеTilemap Collider 2D «TilemapObject» с обнаружением попаданий из инспектора и установите флажок «Использовать в композите» из .

Как указано в предупреждении, это само по себе не имеет никакого эффекта, поэтому выберите «Физика 2D -> Композитный коллайдер 2D» из «Добавить компонент».

Rigidbody 2D добавлен вместе с композитным коллайдером 2D.

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

Я не хочу, чтобы тайловая карта перемещалась, поэтому я оставлю Rigidbody 2D тип тела компонента как «статический».

Теперь запустите игру и попытайтесь заставить ее двигаться. Я думаю, что даже если двигаться по диагонали вдоль стены, она не зацепится и вы сможете двигаться плавно, без ухабистых движений.

Избавьтесь от отталкивания персонажа от стен

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

Чтобы решить эту проблему,Rigidbody 2D выберите объект-символ и измените «Обнаружение столкновений» на «Непрерывный» в компоненте.

Разница между «прерывистым» и «непрерывным» заключается в следующем.

Прерывистый

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

Непрерывный

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

Застрял в углу объекта карты

В зависимости от программы и места некоторые из них пойманы, а некоторые нет, и причина не сильно изменилась. Кстати, это происходит с угловыми углами, как у Box Collider 2D, а не со скругленными кругами.

Даже если такое загадочное явление произойдет, хорошо иметь закругленные углы коллайдера, чтобы избежать зацепок. Он ограничен Box Collider 2D, но чтобы сделать его круглым, компонент Box Collider 2D объекта персонажа имеет «радиус ребра», и вы помещаете туда значение. Если ввести 1 в качестве числовой единицы, произойдет округление размера объекта. Это зависит от размера, но хорошо поставить около 0,1.

Кстати, оценка попадания увеличивается только на величину округлости, поэтому, пожалуйста, отрегулируйте ее, если она большая. В Box Collider 2D есть кнопка Collider Edit, которая позволяет изменять его размер прямо в представлении, нажав кнопку. Поскольку внешняя зеленая линия является фактическим обнаружением попадания, установите размер так, чтобы он не был неестественным.

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