Реалізуйте виявлення звернень за допомогою tilemaps

Сторінка оновлюється :
Дата створення сторінки :

Середовище перевірки

Вікна
  • вікна 11
Редактор єдності
  • 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 with 2D Tilemap Extras також здатні виявляти зіткнення, але вони не будуть використовуватися в цій статті, оскільки процедура буде довгою.

Підготуйте оригінальне зображення MapTip і додайте його в свій проект. Щоб полегшити розуміння операції, підготуйте «місце для прогулянок» та «недоступне для прогулянок» місце для матеріалу чіпа карти.

Налаштуйте його для MapChips в Інспекторі та натисніть кнопку Застосувати. Після налаштування відкрийте редактор спрайтів.

Це 32-піксельна картографічна підказка, тому я розділю її на 32.

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

Створіть папку MapChipPalette в Scenes і вкажіть її.

Додайте картографічну підказку, перетягнувши її на палітру. Збережіть його в папці MapChipPalette, яку ви створили раніше.

Створити карту

Цього разу судження про потрапляння на карту буде виконано в одиницях "Tilemap". Тому ми створимо дві Tilemaps, "Tilemap без виявлення звернень" і "Tilemap з виявленням звернень".

Спочатку створіть два карти плиток в ієрархії. Ви можете створити два в сітці. Назви "TilemapObeject" і "TilemapGround" для наочності.

Спочатку створіть "TilemapGround". Так як це рухомий діапазон, можна просто укласти грунт. Якщо вона знаходиться на землі, можна змінити малюнок.

До речі, якщо символ прихований, виділіть символьний об'єкт і встановіть порядок шарів інспектора Sprite Renderer на 2. Порядок шарів за замовчуванням дорівнює 0, а мапа плиток дорівнює 0, тому, якщо ви збільшите її над цим значенням, вона буде відображатися на передньому плані.

Потім виберіть TilemapObject і розмістіть підказку, яку потрібно зробити нерухомою. Спочатку встановіть порядок шарів на 1. Це робиться для того, щоб він з'явився перед землею.

Ось як це виглядає, якщо заховати грунт.

Звичайно, на даний момент немає ніяких налаштувань, пов'язаних з виявленням зіткнень, тому ви можете нормально їздити по височинах. Після цього ми встановимо виявлення зіткнення.

Налаштування виявлення зіткнень

Для початку налаштуємо персонажа. Ця настройка практично не відрізняється від порад нижче, тому я пропущу деталі і коротко поясню процедуру.

Виділіть символьний об'єкт з ієрархії та виберіть "Фізика 2D -> колайдер 2D з "Додати компонент". Якщо форма об'єкта прямокутна, цілком підійде «Box Collider 2D».

Аналогічним чином додайте "Фізика 2D -> Жорстке тіло 2D".

Встановіть шкалу гравітації на 0, щоб запобігти Rigidbody 2D автоматичному падінню.

Поставте прапорець Z у розділі Обмеження, щоб запобігти обертанню спрайту під час зіткнення.

Далі виберіть "TilemapObject", який ви хочете вдарити, і виберіть "Tilemap -> Tilemap Collider 2D" з "Add Component".

Ось і все, що до цього є. Вам навіть не потрібно ніякого програмування. Запустіть гру і спробуйте вдаритися об предмет, який стає стіною. Я думаю, ви можете переконатися, що це зупиняється належним чином.

Однак, коли ви дійсно вдарите по ньому, я думаю, що в поведінці будуть моменти занепокоєння. Ось кілька рішень:

Незручна поведінка виявлення звернень з картою та рішеннями

Коли ви вдаритеся об стіну, ви можете виявити кілька речей, які вас турбують.

Якщо ви будете рухатися об стіну, ви потрапите в середину

Box Collider 2D Я думаю, що це станеться, якщо ви використовуєте об'єкт.

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

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

Circle Collider 2D Думаю, це легко зрозуміти, якщо прикріпити . Стіна повинна бути рівною, але якщо ви присунете її до стіни, то побачите, що стіна рухається як ніби нерівна.

Причини і способи усунення корчів і шишок

Причина, чому це відбувається, здається, полягає в тому, що «визначення удару виконується на основі картографічного чіпа». Насправді, коли ви вибираєте TilemapObject, на місці, де знаходиться виявлення звернень, з'являється зелена лінія, і ви можете побачити, що це лінія, намальована в одиницях MapTip.

Так, якщо рухомий об'єкт знаходиться на лінії, еквівалентній рівно одній картографічній фішці, це буде оцінюватися як попадання однією картографічною фішкою. Якщо ви зіткнетеся на межі фішок карти, дві фішки карти будуть вражені і оцінені, тому сила відскоку збільшиться.

Я думаю, що найкращим способом вирішення цієї проблеми є поєднання виявлення звернень з прикріпленими чіпами карт. Ось як це зробити:

ВиберітьTilemap Collider 2D "TilemapObject" з виявленням звернень від інспектора та поставте галочку "Use in composite" від .

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

Жорстке тіло 2D додається разом з композитним колайдером 2D.

Це трохи заплутано, але, думаю, можна підтвердити, що зелена лінія на кордоні між чіпами карт з виявленням попадань зникла.

Я не хочу, щоб карта плиток переміщувалася, тому я залишу Rigidbody 2D тип корпусу компонента як "статичний".

Тепер запустіть гру і спробуйте змусити її рухатися. Думаю, що навіть якщо рухатися по діагоналі уздовж стіни, вона не зачепиться і можна плавно рухатися без горбистих рухів.

Усунення персонажа відштовхується від стін

Ви можете бачити, що якщо ви перемістите персонажа, щоб штовхнути стіну, а потім перестати рухатися, він буде вести себе трохи як відскочити від стіни.

Щоб вирішити цю проблему,Rigidbody 2D виділіть символьний об'єкт і змініть "Виявлення зіткнень" на "Безперервне" з компонента.

Різниця між «переривчастими» і «безперервними» полягає в наступному.

Розривною

Виявлення зіткнень - це механізм, який мислить після переміщення. Це форма, яка виконує виявлення зіткнення зі стану, де вона переміщена і вбудована в стіну. Це легко зрозуміти, якщо асоціювати його з батутами і гумою, але чим більше він буде закладений, тим сильніше буде збільшуватися сила відштовхування, а відскок буде сильніше. Натомість розрахунок виконується після переїзду, тому вартість обробки невисока.

Безперервний

Він обробляється під час визначення, що знаходиться в дорозі. Визначити, чи є стіна між положенням до і після переміщення, Якщо є стіна, вона буде судити про зіткнення там і зупиниться, тому відштовхування практично немає. Натомість вартість обробки трохи збільшується, оскільки розрахунок включається в середину руху.

Опинилися в кутку об'єкта карти

Залежно від програми та місця розташування, деякі ловляться, а деякі ні, і причина не сильно змінилася. До речі, це відбувається з кутовими кутами на кшталт Box Collider 2D, а не з округлими колами.

Навіть якщо відбувається таке загадкове явище, добре мати закруглені кути колайдера, щоб уникнути корчів. Він обмежений Box Collider 2D, але, щоб зробити його круглим, компонент Box Collider 2D об'єкта персонажа має «радіус краю», і ви ставите туди значення. Якщо ввести 1 як числову одиницю, для розміру об'єкта відбудеться округлення. Це залежить від розміру, але добре ставити близько 0,1.

До речі, судження про влучення збільшується тільки на розмір округлості, тому, будь ласка, відрегулюйте його, якщо воно велике. Box Collider 2D має кнопку редагування колайдера, яка дозволяє змінювати його розмір безпосередньо на перегляді, натиснувши кнопку. Оскільки зовнішня зелена лінія є фактичним виявленням попадання, встановіть розмір так, щоб він не був неприродним.

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