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 — Отображает сетку тайлов

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

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