Manuals
Manuals




This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English

Компоненти

Компоненти (components) надають ігровим об’єктам (game objects) певного вигляду та/або функціональності. Компоненти мають міститися всередині ігрових об’єктів, і на них впливають позиція, поворот та масштаб ігрового об’єкта, якому вони належать:

Компоненти

Багато компонентів мають властивості, специфічні для їхнього типу, які можна змінювати. Для взаємодії з компонентами під час виконання також доступні функції, специфічні для їхнього типу:

-- disable the can "body" sprite
msg.post("can#body", "disable")

-- play "hoohoo" sound on "bean" in 1 second
sound.play("bean#hoohoo", { delay = 1, gain = 0.5 } )

Компоненти додають до ігрового об’єкта на місці (in-place) або за посиланням (by reference) на файл компонента:

Клацніть правою кнопкою миші ігровий об’єкт у вікні Outline і виберіть Add Component (додати на місці) або Add Component File (додати за посиланням на файл).

У більшості випадків доцільно створювати компоненти на місці, але компоненти наведених нижче типів потрібно спочатку створити в окремих файлах ресурсів, а потім додати до ігрового об’єкта за посиланням:

  • Script
  • GUI
  • Particle FX
  • Tile Map

Типи компонентів

Defold підтримує такі типи компонентів (component):

Додаткові компоненти можна додати за допомогою розширень:

Увімкнення та вимкнення компонентів

Компоненти ігрового об’єкта вмикаються під час його створення. Щоб вимкнути компонент, надішліть йому повідомлення disable:

-- disable the component with id 'weapon' on the same game object as this script
msg.post("#weapon", "disable")

-- disable the component with id 'shield' on the 'enemy' game object
msg.post("enemy#shield", "disable")

-- disable all components on the current game object
msg.post(".", "disable")

-- disable all components on the 'enemy' game object
msg.post("enemy", "disable")

Щоб знову ввімкнути компонент, надішліть йому повідомлення enable:

-- enable the component with id 'weapon'
msg.post("#weapon", "enable")

Властивості компонентів

Усі типи компонентів Defold мають різні властивості. На панелі Properties редактора відображаються властивості компонента, вибраного на панелі Outline. Докладніше про доступні властивості компонентів читайте в посібниках для відповідних типів компонентів.

Позиція, поворот і масштаб компонента

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

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

Порядок відображення компонентів

Порядок відображення візуальних компонентів залежить від двох чинників:

Предикати скрипта рендерингу

Кожному компоненту призначено матеріал, а кожен матеріал має один або кілька тегів. Скрипт рендерингу, своєю чергою, визначає низку предикатів, кожен із яких відповідає одному або кільком тегам матеріалу. У функції update() скрипта рендерингу предикати відображаються один за одним, і для кожного предиката відображаються компоненти, що відповідають визначеним у ньому тегам. Стандартний скрипт рендерингу спочатку відображає спрайти та карти плиток за один прохід, а потім ефекти частинок за інший прохід, в обох випадках у світовому просторі. Далі скрипт рендерингу відображає компоненти GUI за окремий прохід в екранному просторі.

Значення z компонента

Усі ігрові об’єкти та компоненти розташовані в 3D-просторі, а їхні позиції задано об’єктами vector3. Коли ви переглядаєте графіку гри у 2D, значення X та Y визначають позицію об’єкта вздовж осей «ширини» та «висоти», а позиція Z визначає позицію вздовж осі «глибини». Позиція Z дає змогу керувати видимістю об’єктів, що перекриваються: спрайт зі значенням Z, рівним 1, відображатиметься перед спрайтом із позицією Z, рівною 0. За замовчуванням Defold використовує систему координат, у якій значення Z можуть бути від -1 до 1:

модель

Компоненти, що відповідають предикату рендерингу, відображаються разом, а порядок їх відображення залежить від підсумкового значення z компонента. Підсумкове значення z компонента — це сума значень z самого компонента, ігрового об’єкта, якому він належить, і всіх батьківських ігрових об’єктів.

Порядок відображення кількох компонентів GUI не визначається їхнім значенням z. Порядком відображення компонентів GUI керує функція gui.set_render_order().

Приклад: два ігрові об’єкти A та B. B — дочірній об’єкт A. B має компонент спрайта.

Об’єкт Значення Z
A 2
B 1
B#sprite 0.5

У наведеній вище ієрархії підсумкове значення z компонента спрайта в B становить 2 + 1 + 0.5 = 3.5.

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

Скрипт рендерингу визначає ближню та дальню площини для значень z. Компоненти, значення z яких виходять за межі цього діапазону, не відображатимуться. За замовчуванням діапазон становить від -1 до 1, але його легко змінити. Числова точність значень Z за ближньої та дальньої меж -1 і 1 дуже висока. Під час роботи з 3D-ресурсами вам може знадобитися змінити ближню та дальню межі стандартної проєкції у власному скрипті рендерингу. Докладніше читайте в посібнику з рендерингу.

Оптимізація максимальної кількості компонентів

Файл налаштувань game.project містить багато значень, які задають максимальну кількість ресурсів певного типу, що можуть існувати одночасно. Часто цю кількість рахують окремо для кожної завантаженої колекції (collection), яку також називають світом. Рушій Defold використовує ці максимальні значення, щоб заздалегідь виділити пам’ять для відповідної кількості ресурсів і уникнути динамічного виділення та фрагментації пам’яті під час роботи гри.

Структури даних Defold для представлення компонентів (components) та інших ресурсів оптимізовано для мінімального споживання пам’яті. Утім, ці значення слід задавати обачно, щоб не виділяти більше пам’яті, ніж насправді потрібно.

Щоб додатково оптимізувати використання пам’яті, під час збирання Defold аналізує вміст гри й перевизначає максимальні значення, якщо точну кількість можна встановити напевно:

  • Якщо колекція не містить компонентів-фабрик (factory components), пам’ять буде виділено для точної кількості компонентів кожного типу та ігрових об’єктів (game objects), а максимальні значення буде проігноровано.
  • Якщо колекція містить компонент-фабрику, об’єкти, які він створює, буде проаналізовано. Максимальні значення застосовуватимуться до компонентів, які можуть створювати фабрики, та до ігрових об’єктів.
  • Якщо колекція містить фабрику або фабрику колекцій з увімкненою опцією “Dynamic Prototype”, вона використовуватиме максимальні значення лічильників.