Перші кроки Кімнатами та Порталами

Керівник кімнат RoomManager

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

Перетворення кімнати

Перетворення має відбуватися щоразу, коли ви хочете активувати систему. Воно не зберігає графік кімнати у вашому проекті (для гнучкості та збереження пам'яті). Ви можете, або запустити його, натиснувши кнопку Перетворити кімнати на панелі інструментів редактора (яка також має комбінацію клавіш), або, ви можете, викликати метод rooms_convert() у RoomManager. Цей останній метод дасть ігровий результат. Зверніть увагу, що, для безпеки, найкраще викликати rooms_clear() перед вивантаженням, або зміною рівнів.

../../../_images/convert_rooms_button.png

Якщо ви перетворите рівень під час роботи редактора, система вибракування порталів перейме звичайне вибракування Godot. Це може вплинути на деякі функції редактора. З цієї причини ви можете ввімкнути та вимкнути вибракування порталів, використовуючи перемикач Переглянути відбраковування Portal в меню Перегляд на панелі інструментів редактора (який також має сполучення клавіш), або через параметр Active на вузлі RoomManager.

Примітка

Щоб використовувати RoomManager, ви повинні вказати йому, де знаходяться кімнати у вашому дереві сцени, а точніше, де знаходиться вузол RoomList (Список Кімнат). RoomList є батьком ваших кімнат - дивіться нижче. Якщо його не встановлено, перетворення не вдасться, і з'явиться діалогове вікно з попередженням.

../../../_images/room_manager.png

RoomList (Список Кімнат)

Перш ніж створювати будь-які кімнати, ми повинні створити вузол, який буде батьком всіх статичних об'єктів, кімнат, груп кімнат і так далі на нашому рівні. Цей вузол називається RoomList (Список Кімнат).

../../../_images/roomlist_node.png

Примітка

RoomList - це не є якийсь особливий тип вузла, це може бути звичайний просторовий вузол.

Вам потрібно буде помістити вузол RoomList в RoomManager, щоб RoomManager знав, де знайти кімнати.

Чому ми використовуємо певну гілку дерева сцени, а не використовуємо корінь сцени? Відповідь полягає в тому, що є багато внутрішніх деталей системи, якими легше керувати, якщо кімнати розміщені на власній гілці.

Часто ви в кінцевому підсумку повністю змінюєте гілку списку кімнат під час роботи гри, коли завантажуєте та вивантажуєте рівні.

Кімнати

Що таке кімната?

Кімнати- це спосіб просторового розподілу вашого рівня на області, які мають сенс з точки зору дизайну рівня. Кімнати часто є буквальними кімнатами (наприклад, в будівлі). Зрештою, для рушія, кімната являє собою опуклий об’єм, який не перетинається з іншим, і в якому ви, зазвичай, розміщуєте більшість своїх об’єктів, які потрапляють в цю область.

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

Чому опукла?

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

Опуклий корпус. Корпус визначається як серія площин, повернутих назовні. Якщо точка знаходиться позаду всіх площин, вона знаходиться в корпусі.

../../../_images/convex_hull.png

Чому недопустимі перетини?

Якщо дві кімнати перетинаються, і камера, або гравець, знаходиться в зоні перетину, то немає ніякого способу вказати, в якій кімнаті повинен знаходитися (і відтворюватися) об'єкт. Вимога для кімнат не перетинатися, має наслідки для проектування рівня.

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

../../../_images/room_overlap.png

Система намагається впоратися з перетином кімнат якомога краще, роблячи поточну кімнату "липкою". Кожен об'єкт пам'ятає, в якій кімнаті він знаходився в останньому кадрі, і залишається в ній до тих пір, поки не вийде за межі опуклого корпусу кімнати. Це може призвести до невеликого гістерезису в зонах перетину.

Однак є один виняток для внутрішніх кімнат. Вам не доведеться турбуватися про них на початку.

Як створити кімнату?

Кімната - це тип вузла під назвою Room, який можна додати до дерева сцени, як і будь-який інший. Ви можете розмістити об'єкти всередині кімнати, зробивши їх дітьми та онуками вузла Room.

Як визначити форму і положення опуклого корпусу моєї кімнати?

Оскільки визначення меж кімнати є найважливішим аспектом системи, є ТРИ методи, доступні для визначення форми кімнати в Godot:

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

  2. Вручну редагуйте точки, які визначають опуклий корпус кімнати, в інспекторі, або перетягуючи точки за допомогою редактора gizmo (див. Редагування точок кімнати).

  3. Надайте прив'язку вручну. Це MeshInstance в кімнаті, який має геометрію у формі потрібної межі, з назвою, що закінчується на -bound (межа). Таке ви можете зробити, якщо створюєте свої рівні в Blender або аналогічних програмах (див. Створення систем кімнат в Blender (або інших інструментах моделювання)).

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

Автоматичний метод використовується щоразу, коли не надається ручна прив'язка.

Проста пара кімнат. Поле порталу показано напівпрозорим червоним кольором, а корпуси приміщення показані зеленим каркасом.

../../../_images/simple_room.png

Портали

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

Портали - це спеціальні опуклі багатокутники. Ви вішаєте їх на отвори між кімнатами, щоб дозволити системі бачити крізь них. Ви можете створити вузол порталу Portal безпосередньо в редакторі. Портал за замовчуванням має 4 точки і поводиться так само, як MeshInstance. Ви можете додавати, або видаляти, точки за допомогою інспектора. Для роботи порталу знадобиться не менше 3 точок - це тому, що йому потрібно сформувати багатокутник, а не точку, чи лінію.

Бережіть зусилля при редагуванні, між кожною парою Кімнат потрібен лише один Портал. Вам не потрібно (і дійсно не слід) створювати два Портали, які перетинаються в протилежних напрямках. Портали за замовчуванням є двосторонніми (але ви можете зробити їх односторонніми в Інспекторі).

Тому ви повинні розмістити портал тільки в одній з кожної пари сусідніх кімнат - це "вихідна кімната" порталу. Як правило, не має значення, яку кімнату ви виберете в якості вихідної. Нормаль порталу (стрілка в gizmo) повинна бути спрямована назовні від вихідної кімнати.

../../../_images/portal_inspector.png

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

Прив'язка Порталу

Є два варіанти вирішення питання про те, до якого приміщення прив'язувати портал.

  • Залиште Linked Room (Пов'язану Кімнату) в інспекторі порожнім. Система спробує автоматично зв'язати портал з найближчою сусідньою кімнатою під час перетворення. У більшості випадків це добре працює.

  • Ви можете чітко вказати кімнату, встановивши Linked Room в інспекторі.

Примітка

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

Тепер спробуйте

До теперішнього часу ви повинні мати можливість створити пару кімнат, додати деякі вузли, такі як MeshInstances до кімнат, і додати портал між кімнатами. Спробуйте перетворити кімнати в редакторі, і подивитися, чи можете ви тепер побачити об'єкти в сусідніх кімнатах, через портал.

../../../_images/simple_scenetree.png

Тепер ви освоїли основні принципи системи.

Наступним кроком є вивчення різних типів об'єктів, якими може керувати система.