Фізика, що стоїть за Raycasting в Unity

Трансляція променів у Unity дозволяє виявляти перетини між променем та ігровими об’єктами на сцені. Це життєво важлива техніка, яка часто використовується для прямої видимості персонажа, механіки стрільби або виявлення об’єктів. Механізм Unity забезпечує 2D- і 3D-трансляцію за допомогою своєї фізичної системи. Цей підручник охоплює основні аспекти трансляції променів в обох вимірах із короткими прикладами коду для ілюстрації концепцій.

1. Основи Raycasting

  • промінь у контексті Unity визначається початковою точкою та напрямком. Коли цей промінь кидається, він «мандрує» у своєму напрямку, виявляючи будь-які об’єкти, які він перетинає.

2D Raycasting:

Vector2 rayOrigin = new Vector2(1, 1);
Vector2 rayDirection = new Vector2(1, 0);
float rayLength = 10f;

RaycastHit2D hitInfo = Physics2D.Raycast(rayOrigin, rayDirection, rayLength);

if (hitInfo.collider != null)
{
    Debug.Log("Hit: " + hitInfo.collider.name);
}

3D Raycasting:

Vector3 rayOrigin = new Vector3(1, 1, 1);
Vector3 rayDirection = new Vector3(1, 0, 0);
float rayLength = 10f;

RaycastHit hitInfo;
bool hasHit = Physics.Raycast(rayOrigin, rayDirection, out hitInfo, rayLength);

if (hasHit)
{
    Debug.Log("Hit: " + hitInfo.collider.name);
}

2. Дайвінг глибше: структура 'RaycastHit'

  • Коли raycasting успішно виявляє об’єкт, він повертає інформацію у структурі. Для 2D це 'RaycastHit2D', а для 3D це 'RaycastHit'.

Загальні властивості включають:

  • 'collider': Коллайдер, в який потрапив промінь.
  • 'point': точка у світі, де промінь потрапив на поверхню колайдера.
  • 'distance': Відстань від початку променя до точки попадання.

3. Маски шарів: фільтрація результатів Raycast

  • Часто виникає необхідність обмежити, на які об'єкти може влучити промінь. Для цього Unity пропонує маски шарів.

2D Реалізація:

int layerMask = 1 << 8;  // Assuming objects to be hit are on layer 8
RaycastHit2D hitInfo = Physics2D.Raycast(rayOrigin, rayDirection, rayLength, layerMask);

3D Реалізація:

int layerMask = 1 << 8;  // Assuming objects to be hit are on layer 8
bool hasHit = Physics.Raycast(rayOrigin, rayDirection, out hitInfo, rayLength, layerMask);

Питання для адреси:

  1. Яка різниця між 2D і 3D трансляцією в Unity?: хоча основна концепція залишається незмінною, 2D трансляція повертає 'RaycastHit2D' структуру та використовує клас 'Physics2D', тоді як 3D raycasting повертає 'RaycastHit' має структуру та використовує клас 'Physics'.
  2. Чому можна використовувати маски шарів із трансляцією?: маски шарів дозволяють фільтрувати результати трансляції. Це гарантує, що промінь взаємодіє лише з певними шарами, забезпечуючи точний контроль над тим, що промінь може виявити.
  3. Як можна динамічно визначити початкову точку променя?: часто початок променя збігається з камерою або положенням персонажа. Це динамічне призначення можна виконати за допомогою 'Camera.main.transform.position' для позиції камери або 'gameObject.transform.position' для позиції ігрового об’єкта.

Висновок

Розуміючи raycasting у Unity, можна ефективно реалізувати такі ігрові механізми, як виявлення об’єктів, стрільба та лінія видимості. Пам’ятайте, що під час роботи в Unity Engine потрібно розумно використовувати маски шарів для точного налаштування взаємодії променів і завжди пам’ятати про просторовий контекст (2D проти 3D).

Рекомендовані статті
Як виявити зіткнення за допомогою коду в Unity
Додавання фізики стрибучого м’яча в Unity
Створення гоночної гри на основі фізики в Unity
Створення симуляції прапора в Unity
Впровадження механіки майнінгу в Unity Game
Як перевірити, чи жорсткокорпусний гравець заснований на єдності
DestroyIt - Destruction System - Огляд пакета магазину ресурсів Unity