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

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

-- 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 } )

Компоненты добавляются в игровой объект либо непосредственно на месте, либо в виде ссылки на файл компонента:

Сделайте двойной клик на игровом объекте в представлении Outline и выберите Add Component (добавить на месте) или Add Component File (добавить как ссылку на файл).

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

  • Скрипт (Script)
  • GUI
  • Эффекты частиц (Particle FX)
  • Тайловая карта (Tile Map)

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

Defold поддерживает следующие типы компонентов:

  • Collection Factory — Порождает коллекции
  • Collection Proxy — Загружает и выгружает коллекции
  • Collision Object — Оснащает игровой объект физическим поведением
  • Camera — Отвечает за область видимости и проекцию игрового мира
  • Factory — Порождает игровые объекты
  • GUI — Визуализирует графический пользовательский интерфейс
  • Label — Визуализирует текстовые фрагменты
  • Mesh — Отображает 3D-сетку (с возможностью создания и манипулирования при выполнении)
  • Model — Отображает 3D-модель (с возможностью анимации)
  • Particle FX — Порождает частицы
  • Script — Оснащает игру логикой
  • Sound — Воспроизводит звуки или музыку
  • Spine Model — Визуализирует Spine-анимацию
  • Sprite — Отображает 2D-изображение (с возможностью мултикадровой анимации)
  • Tile Map — Отображает сетку тайлов

Дополнительные компоненты можно добавить с помощью расширений:

  • Rive model — Визуализирует анимацию Rive
  • Spine model — Визуализирует анимацию Spine

Включение и отключение компонентов

Компоненты игрового объекта активируются при создании этого игрового объекта. Если требуется отключить компонент, это делается путем отправки ему сообщения disable:

-- отключить компонент с id 'weapon' в том же игровом объекте, что и этот скрипт
msg.post("#weapon", "disable")

-- отключить компонент с идентификатором 'shield' в игровом объекте 'enemy'
msg.post("enemy#shield", "disable")

-- отключить все компоненты в текущем игровом объекте
msg.post(".", "disable")

-- отключить все компоненты игрового объекта 'enemy'
msg.post("enemy", "disable")

Чтобы снова включить компонент, достаточно отправить ему сообщение enable:

-- включить компонент с id 'weapon'
msg.post("#weapon", "enable")

Свойства компонента

В Defold компоненты всех типов имеют различные свойства. Панель Properties в редакторе отображает свойства текущего выделенного в Outline компонента. За дополнительной информацией о доступных свойствах обращайтесь к руководствам по различным типам компонентов.

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

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

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

Порядок отрисовки компонентов

Порядок отрисовки визуальных компонентов зависит от двух факторов.

Предикаты рендер-скрипта

Каждому компоненту назначается материал, и каждый материал имеет один или несколько тегов. Рендер-скрипт, в свою очередь, определяет ряд предикатов, каждый из которых соответствует одному или нескольким тегам материала. В функции update() рендер-скрипта предикаты отрисовываются один за другим, а также отрисовываются компоненты, соответствующие тегам, определенным в каждом предикате. Рендер-скрипт по умолчанию сперва отрисовывает спрайты и тайловые карты за один проход, затем частицы за другой проход (оба в мировом пространстве). Далее рендер-скрипт переходит к отрисовке компонентов графического интерфейса в отдельном проходе в пространстве экрана.

Значение по оси Z

Все игровые объекты и компоненты позиционируются в 3D пространстве, причем позиции выражаются в виде объектов типа vector3. Когда мы просматриваем графическое содержимое игры в 2D, значения по осям X и Y определяют позицию объекта вдоль осей “ширины” и “высоты”, а значение по Z определяет позицию вдоль оси “глубины”. Позиция по Z позволяет управлять видимостью перекрывающихся объектов: спрайт со значением по Z, равным 1, будет отображаться поверх спрайта в позиции по Z, равной 0. По умолчанию Defold использует систему координат, допускающую значения по оси Z от -1 до 1:

model

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

Порядок отрисовки нескольких компонентов GUI значением по Z не определяется. Он контролируется функцией gui.set_render_order().

Пример: Есть два игровых объекта A и B. B является дочерним по отношению к A. B имеет компонент Sprite.

What Z-value
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-ассетами может возникнуть необходимость изменить ближний и дальний пределы проекции по умолчанию в пользовательском рендер-скрипте. За подробностями обращайтесь к руководству по рендерингу.

Оптимизация max count для компонентов

Файл настроек game.project содержит множество значений, задающих максимальное количество определённого ресурса, которое может существовать одновременно, часто в расчёте на одну загруженную collection (также называемую world). Движок Defold использует эти максимальные значения для предварительного выделения памяти, чтобы избежать динамических аллокаций и фрагментации памяти во время работы игры.

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

Чтобы дополнительно оптимизировать использование памяти, процесс сборки Defold анализирует содержимое игры и переопределяет max counts, если можно точно определить нужное количество:

  • Если collection не содержит компонентов factory, будет выделено точное количество каждого компонента и Game Object, а значения max count будут проигнорированы.
  • Если collection содержит компонент factory, будут проанализированы спаунимые объекты, и max count будет использоваться для компонентов, которые могут быть созданы из factory, а также для Game Objects.
  • Если collection содержит factory или collection factory с включённой опцией “Dynamic Prototype”, для этой collection будут использоваться max counters.