Godot, 1000 мелочей

    Недавно открыл для себя Godot engine, опенсурсный игровой движок. Делюсь некоторыми приёмами и заметками, в основном из области 3д, кода или общих моментов.


    У Godot в целом репутация скорее 2д движка, которое проработано довольно хорошо, но и не так давно появившиеся 3д возможности позволяют делать трёхмерные игры. Особенно если вы в состоянии оптимизировать какие-то вещи самостоятельно, не делаете слишком уж тяжёлую и комплексную игру, а также вас устраивают текущие варианты рендера. Ну или можете ждать будущих оптимизаций и появления vulkan.

    «Из коробки» в движке есть некоторая физика, в том числе джоинты и колёсный транспорт. Нет встроенного редактора terrain, но можно воспользоваться плагином, импортировать из специализированных программ или просто как меш из 3д пакета. В последнем случае ради производительности придётся самостоятельно резать ландшафт на фрагменты-чанки, и скорее всего делать им отдельные меши под коллизии. Что касается мешей под форму коллизии ландшафта — чтобы не было визуальных нестыковок, нужно триангулировать модель во время экспорта из 3д пакета. Например, один из простейших способов это сделать в Blender — экспортировать меш в формате collada (.dae), там по дефолту стоит галочка triangulate.
    Иногда модель из Blender придётся переворачивать на 180 градусов внутри Godot, поэтому не удивляйтесь если вашего terrain'a не видно — скорее всего он повёрнут нормалями не в ту сторону.

    Godot практикует подход «всё есть сцена» и заточен под древовидную структуру элементов. На практике это означает, что новые объекты на уровень добавляются как ветки к уже существующим на нём узлам, их можно сворачивать в префабы и открывать отдельно, как будто это их отдельный маленький локальный мирок. Таким образом очень удобно редактировать всевозможные сохранённые составные объекты, единственный момент — если на вашем уровне был выставлен свет, то, допустим, зайдя внутрь персонажа, в его локальную сцену, вы этого освещения не увидите и настраивая его материалы не будете понимать как они смотрятся на свету. Эту проблему можно решать по разному, например, переключаясь в окно уровня и оценивая происходящие изменения с персонажем, после сохранения его сцены, там. Или просто временно бросить источник света внутрь префаба с персонажем.


    Сцена с объектом theEnergy, который будет помещён на уровень для сбора игроком. В качестве основы используется узел Area, к которому прикреплена форма коллизии, а также сферический примитив, внутрь которого вложен ещё один.

    Что касается языков, то если не рассматривать низкоуровневый способ, наиболее ходовые варианты — это скриптовые языки GDScript и C#, а также визуальный скриптинг для чего-то простого. GDScript лучше интегрирован в движок, имеет больше примеров, не требует запуска внешней среды, а в плане общей структуры тут будет происходить всё то же, что в варианте C# — объявление переменных, вызов функции инициализации, цикл процессов, цикл физических процессов и так далее. Так что выбор GDScript в качестве основного скриптового языка разработки имеет смысл. Пересаживаясь на местный C# получим разве что большую аккуратность и подробность записи, теряя в лаконичности, но усиливая разборчивость и контроль над ситуацией — фигурные скобочки вместо использования табуляции, отметки конца строки, более формальную типизацию.


    Код, прикреплённый на вышеупомянутый объект (на языке GDScript). Заводится переменная идентификатор, значение которой можно будет выставить в редакторе, Далее одноразовая функция инициализации, в которой ничего особенного не происходит (и можно было её стереть). Далее описан метод-обработчик сигнала, который должен будет удалять объект.

    Что касается глобальных переменных, то для их использования что в GDScript, что в C# потребуется добавить в параметрах проекта глобальный скрипт/скрипты в автозагрузку, к переменным которого можно будет обращаться глобально.
    Также в Godot действует ограничение -на каждом объекте не может быть больше одного скрипта. Но этот момент можно обойти, например, повесив второй скрипт на дочерний объект.

    Сигналы


    Для обмена данными между узлами в Godot можно также воспользоваться иерархией, ведь объекты крепятся друг к другу, как ветки к дереву. Правда у этого подхода свои подводные камни, ведь в нашей игре иерархия может быть динамически изменяемой. К тому же обращение к иерархии в пределах одной сцены — это одно, а вот когда у тебя сцена внутри сцены внутри сцены, то с этим возникают некоторые сложности, хотя бы даже чисто в понимании происходящего.
    Один из способов со всем этим управляться и не слишком привязываться именно к конкретной текущей иерархии — это сигналы. Какое-то количество общих сигналов уже предустановлено — можно заглянуть в панель сигналов объекта, чтобы прикрепить строку с обработкой получения одного из них в скрипт того же объекта или другого объекта со скриптом, в пределах сцены. Если же нужно сделать свой собственный сигнал, то делается это так:


    Заводим сигнал

    Излучаем его в том же скрипте при нажатии кнопки или других условиях

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


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

    В сигнал можно также прикрепить какие-то переменные, что может быть довольно полезно. Например, вместо того чтобы заводить разные сигналы на объекте, мы можем обойтись одним, но будем отправлять его с разными параметрами и дополнительно обрабатывать при получении.


    А вот и описание самого метода, который мы заводили выше. Получая сигнал он обрабатывает посланную с ним переменную.

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


    Происходит событие и мы смотрим, есть ли у вошедшего в зону объекта нужный метод.


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

    CSG-объекты



    Один из полезных 3д инструментов в Godot — примитивы constructive solid geometry. Проще говоря это объекты, поддерживающие булевы операции — пересечение, исключение, объединение. Кроме набора примитивов есть универсальный CSG Mesh, в качестве формы для которого можно установить уже произвольный меш.



    Пустышка CSG Combiner потребуется для использования в иерархии, чтобы управлять приоритетом применения операций, если в этом есть необходимость при сборе какой-то сложной конструкции.


    Пара сфер, из которых вырезаны дочерние сферы.

    Основное применение CSG — удобство и простота прототипирования статики уровня и каких-то его элементов. По факту можно сделать меш в 3д пакете, и повторить в нём те же самые результирующие формы, разве что этим надо будет заниматься вне игрового редактора.

    Следующее применение статических CSG — имитация разрушаемости и повреждений. для этого требуется расставить CSG примитивы в режиме исключения, как дыры, «огрызки» и вмятины, а затем временно скрыть, включая видимость в нужный момент. Ограничение тут в том, что «повреждать» мы можем только поверхность CSG объекта, к тому же «повреждение» должно быть изначально прикреплено к нему как дочернее либо крепиться через код, как потомок. Зато такой вариант по гибкости настройки уже значительно выигрывает по сравнению с заготовленным в 3д-пакете разрушаемым объектом.


    В мост встроены 3 цилиндра в режиме исключения. Пока они скрыты мост целый.

    Если их включить, то вырезается исключаемая ими область.

    Далее у нас идут CSG движущиеся. Через код, либо записанную анимацию. В целом через этот способ можно реализовывать какие-то эффекты, но очень желательно чтобы подобные анимации не крутились на сцене в цикле. Несколько анимированных CSG могут заметно посадить производительность, к тому же в Godot оптимизирует не все вещи, и если вы не вырубите анимированные CSG самостоятельно, то они будут продолжать расходовать производительность вне видимости камеры.
    Тем не менее эффекты анимированных CSG уже сложно заменить решениями 3д пакета, поэтому вы можете быть заинтересованы именно в их использовании (по крайней мере, если не собираетесь рисовать продвинутое 3д через код). Главное найти им правильное применение, лучше всего их использовать точечно, в определённых местах, включая анимацию по триггеру. Как эффект открытия прохода или прочий разовый спецэффект. Естественно, чем проще форма CSG объектов — тем лучше. А основную вычислительную нагрузку они оказывают именно в процессе соприкосновения в движении, притом нет особой разницы, какой именно объект двигать относительно другого.


    На видео есть момент где машинка падает сквозь дыру в мосту, когда анимированная CSG-капсула проходит через CSG Mesh с моделькой моста.

    Мультимеш



    Если нужно растиражировать какой-то меш в огромных количествах, например, разбросав камни или деревья по уровню, то здесь пригодится узел MultimeshInstance.
    После добавления на сцену мультимешу нужно указать, по какому объекту рассыпать копии и что брать в качестве образца для клонов. Попутно можно выбрать размер клонов и их количество. Когда мультимеш «запечён», то он представляет собой множество клонов, а цели, которые он использовал для своей генерации, можно и удалить, если в них больше нет надобности.


    Кнопка для выбора целей мультимеша появляется в окне редактора справа вверху, когда он выбран. Если её нажать, то выпадет это окошко с установками для генерации.


    Здесь мы имеем два объекта добавленные в сцену как узлы MeshInstance. Далее левый объект мы расклонируем по правому.


    Получаем мультимеш. В данной ситуации в настройках было выставлено 10000 клонов. Кстати, если бы их было 3-4 тысячи, то визуально результат не сильно бы отличался.

    «Запечёный» мультимеш можно переместить куда угодно, а кроме того у него есть параметр Visible Instance, изначально отображающий указанное при генерации число клонов. Меняя это значение можно управлять тем, сколько клонов показывается в данный момент. По дефолту там стоит -1, но это специальное значение для отображения максимума клонов. Если поставить 10, клонов будет 10. Если 100, то 100. Если максимумом было 50, то и при 100, и при 1000, и при -1 их так и останется 50.
    Эту возможность мультимеша можно использовать для создания специальных эффектов, анимировав параметр Visible Instance через код или записанную анимацию. Для более тонкого контроля над плотностью клонов можно воспользоваться 3д пакетом, чтобы сделать отдельный меш с цельной сеткой именно в тех местах где нужна максимальная плотность клонов, а те места где их быть не должно, не покрывать полигонами, или сделать в них разрывы.


    Устанавливаем Visible Instance в 500 и плотность заполнения резко снижается.

    Разное



    Управление в Годо можно настроить открыв пункт Проект в верхней панели редактора. Далее Настройки проекта, вкладка Список действий.


    Можно посмотреть как называются дефолтные кнопки, чтобы знать по каким именам к ним обратиться через код. А также добавить свои собственные.

    Например, для кнопки PgUP по дефолту установлено название «ui_page_up», и обработать её нажатие в коде можно написав следующую строчку в GDScript — if Input.is_action_pressed(«ui_page_up»):
    Если требуется действие для однократного нажатия, то is_action_pressed нужно заменить на is_action_Just_pressed. Окончание нажатия — pressed меняется на released.

    #

    Если вам нужно анимировать мерцание материала то можно сделать это через самописный шейдер. Для этого в качестве материала объекта выбираем Новый ShaderMaterial




    Далее в пустом поле выбираем VisualShader


    Щелкаем на него, ниже редактора открывается визуальный редактор

    Добавляем пару узлов, сначала Input — All — Time, затем Scalar — Common — ScalarFunc, выставив в её выпадающем списке, допустим, Sin. В принципе уже такая конструкция даст нечто вроде мерцания между чёрным и белым, но чтобы было получше, добавим ещё один узел Scalar — Common — ScalarFunc и выберем там Abs. Соединяем узлы между собой (обратите внимание, что нажимая на закрытый глаз у каждого узла можно открыть его и посмотреть как изменяется картинка на каждом этапе) и, подключаем к каналу Alpha, Emission или Albedo. Всё, наш объект теперь мерцает.



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

    #

    Чтобы превратить выбранный узел в отдельную сцену нужно щёлкнуть на нём правой кнопкой мыши и выбрать пункт «Сохранить ветку, как сцену». После чего задать имя этой сцене. После этого рядом с названием узла появится значок «Открыть в редакторе», откуда можно перейти к редактированию получившейся сцены в новом окне.
    Чтобы произвести обратную манипуляцию, если нам, допустим, нужно достать объекты сохранённой ветки на текущую сцену, чтобы их как-то пересобрать или модифицировать — жмём на таком узле, скрывающем в себе сцену, правой кнопкой и выбираем пункт «Сделать локальным». Сохранённая сцена, которую он собой представлял, при этом не уничтожается.

    #

    Чтобы пользоваться глобальными переменными, нужно создать скрипт и забросить его в автозагрузку: ПроектНастройки проектаАвтозагрузка. Галочка «синглтон» должна быть отмечена.


    Содержимое скрипта SaveTheWorld, переменные которого мы хотим использовать как глобальные. В данный момент здесь объявлен некий показатель здоровья и массив состояний врагов, заполняющийся на шаге инициализации.

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


    Находим наш SaveTheWorld, после чего проверяем, является ли состояние этого конкретного врага нулевым. Если да, то враг удаляется.

    UPD. Можно обратиться к переменным синглтона сразу через его имя, то есть в примере выше нам не пришлось бы брать ссылку, и вместо main.enemy_arr[myID] обращались бы к SaveTheWorld.enemy_arr[myID]. Но вы должны быть уверены, что у этого узла в автозагрузке отмечена галочка в графе «синглтон».

    #

    Для записи и проигрывания анимаций на сцену добавляется узел AnimationPlayer. Он может находится в произвольном месте в иерархии. Для того, чтобы дать ему возможность записать анимацию нужно нажать на кнопку «Анимация», выше открывшегося таймлайна и создать новую анимацию.
    После этого на каждом выбираемом узле в текущей сцене, справа в инспекторе появятся значки ключа. Если нажать на ключ, то аниматор предложит добавить новую дорожку анимации.



    Далее передвигаем ползунок таймлайна в нужные точки, и в каждой меняем в инспекторе объекта то анимируемое значение, снова нажимая ключ, чтобы эта точка появилась на таймлайне. Расширить доступный таймлан можно в поле с часиками, справа, по умолчанию там выставлена 1 секунда. Правее часиков кнопка зацикливания анимации. Ниже, первой в строке идёт одна из часто-используемых опций, устанавливающая дёрганный дискретный или непрерывный плавный характер анимации.
    Правее центральной панельки с названием анимации находится кнопка автозапуска, если её нажать то выбранная анимация будет проигрываться при запуске приложения. Если вам нужно несколько анимированных объектов, проигрываемых в цикле постоянно, то можно сделать их дорожки в одном AnimationPlayer, создав им одну общую анимацию. Если нужно переключать анимации у какого-то конкретного объекта, то ему можно завести отдельный AnimationPlayer и там создать ему несколько анимаций для разных состояний, при этом только одна из них может быть отмечена как запускаемая автоматически.

    #

    Для различных узлов, например MeshInstance или CollisionShape, в поле Mesh (Shape) можно выбирать из заготовленного списка примитивов (в том числе загрузить свою кастомную модель, в случае с MeshInstance).



    Для MeshInstance одними из наиболее затратных примитивов будут сфера и капсула, так как в них скорее всего будет много полигонов. Поэтому для 3д частиц лучше выбирать что вроде полигона, куба или призмы. Для коллизий, наоборот, форма сферы будет наиболее быстро считаемой, так как из параметров у неё один лишь радиус. Собственно, вышесказанное касается не только Годо, но и прочих игровых движков.
    Также Godot может сделать форму коллизии для MeshInstance автоматически, для этого нужно нажать на кнопку «Массив», которая появляется вверху справа в редакторе, когда выбран MeshInstance. Далее выбираете из предложенных вариантов, но как правило, для того же terrain, это будет первый пункт — «Создать вогнутое статическое тело» (после чего к объекту прикрепится узел StaticBody с вложенной в него точной коллизией). Во всех прочих случаях, когда особо точные коллизии не требуются можно обходиться самостоятельно выставленными примитивами CollisionShape, либо собирать оптимальные меши для коллизий в 3д пакете, после чего добавлять их через MeshInstance и также создавать по их форме коллизию через кнопку «Массив».

    #

    Если в каком-то из числовых полей в инспекторе требуется, например, прибавить к параметру определённое число, умножить значение, и так далее, то можно так и выбивать: «315-180», «20+40», «64*5»… редактор сам посчитает и подставит итоговый результат операции в поле.

    UPD:

    Аудиофайлам по умолчанию (по крайней мере в 3.2.1) выставляется отсутствие проигрывания в цикле (loop) для .wav и зацикливание для .ogg. После закидывания файла в AudioStreamPlayer, например, там будет галочка для параметра loop, но выключить цикл для .ogg таким образом не получится. Чтобы убрать цикличность для таких файлов нужно выбрав файл переключиться на вкладку «Импорт» (рядом со «Сценой»), там убрать галочку с loop и нажать кнопку «Переимпортировать» ниже.

    #

    Когда есть некий объект, параметры которого нужно перенести на другой (положение в пространстве, вращение, масштаб), то, чтобы, не переносить каждое конкретно поле можно скопировать всё сразу, нажав на значок инструментов слева, в Инспекторе. Там в списке есть опция «Копировать параметры». Потом выбирается другой объект и через такую же иконку свойств выбирается опция «Вставить параметры».

    #

    Для удаления объекта через код обычно ему делают вызов queue_free(). Ещё быстрее можно удалить с помощью free(), но это менее безопасный вариант. Удаление слишком тяжёлых объектов вызывает заметную просадку fps, но лёгкие и оптимальные устраняются без просадок. В целом это некий индикатор — если объект удаляется слишком долго, то желательно оптимизировать его. Вызов remove_child(object) тоже похож на удаление, но по факту такой объект всё ещё хранится в памяти, чтобы его можно было снова к чему-то прикрепить, а если прикреплять заново не потребовалось, то эффект близок к вызову hide(), то есть к обычному сокрытию из видимости.
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 24

      0
      Может быть будет интересно рассмотреть еще один движок NeoAxis, он недавно стал open source:
      www.neoaxis.com/news/neoaxis_engine_switched_to_new_royalty_free_open_source_license
        0
        Насколько я понял — там ситуация как с бывшим Xenko (ныне Stride), может чуть лучше. То есть по сути движок сам по себе довольно пустой, с совсем минимальным инструментарием просто добавляй внешние модели и текстуры, ну и код можно писать. Тоже неплохо, но у Годо и 2д есть, и в целом более полноценный 3д инструментарий.
        Хотя конкретно с NeoAxis очень мельком знаком, не знаю нюансов.
          0
          Сначала подумал расписать подробнее. В общем, проще глянуть))
          0
          System requirements: Windows

          Godot на всех трёх ОС работает

            +2

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

              +1
              Ну да, у него полно плюсов и продуманная структура. В целом это практически Blender от мира игровых движков. Опять же для прототипирования это наверное одно из самых быстрых и удобных решений, что я видел.
            +1

            Хотел бы заметить, что обратиться к глобальным узлам (синглтонам) можно просто по имени, которое определяется в настройках проекта, без использования get_node().

              0
              Действительно. В моём примере можно было писать SaveTheWorld.enemy_arr[myID], без получения ссылки, лишь бы на SaveTheWorld была активна галочка синглтона (ну так ради этого всё и затевалось). В документации как-то сильнее акцентирован случай когда синглтон заведён, но почему-то не активирован, поэтому второй вариант в глаза не бросается.
              Ну и замечательно, минус лишняя строчка в большинстве случаев.
              +1

              Движок и правда замечательный в плане логичности и простоты.
              Кстати — жесткую типизацию теперь можно делать и в GDScrypt, просто она необязательна, но разработчики обещают повышение производительности в будущем при использовании жесткой типизации.

              +1
              Ждём обзор UPBGE.org
              Мельком смотрел и понравилось, что используется рендер Eevee.
              Обещают завезти визуальные ноды логики, как в блюпринт\болт в Анрил\Юнити и тп.
              Пример разработки одной игры с ютуба…
                0
                Кроме UPBGE есть ещё Armory3d. Я ни то ни то плотно не пробовал, но BGE хотел попробовать давно, потом его убрали из Blender и было не понятно, что дальше. А тут уже и Годо появился.
                У Godot просто некоторое преимущество хотя бы в том, что на хорошем уровне не только 3д, но и 2д (то есть тот же интерфейс собрать уже не проблема), а также мультиплатформенность, плюс общая продуманность и неплохие перспективы.
                В любом случае разнообразие мощных опенсурсных решений на любой вкус — это великолепно.
                  0
                  Армори к сожалению слишком придирчив к ошибкам модели и материалам, хотя рендер в нём лучше, чем в Eevee. Но стоит запастись терпением, чтоб всё запустилось без ошибок.

                    0
                    Была бы идея, конкретный движок не так принципиален, тут смотря что нравится. Хотя геймплей может базироваться и на особенностях движка, либо из разных игровых движков к конкретному проекту один может подходить оптимально, а другой уже не настолько хорошо.
                0
                У движка один минус, как и у других NodeTree движков — производительность. Все подсистемы перебирают все дерево игры. Что для 3Д уровней, с высококачественными моделями начинают мало того, что долго грузится, так еще и вынуждает танцевать с производительностью и заниматься изощирениями, например тот же Multimesh юзать, где ему не место.
                Там сама процедура парсинга сцены и всех подсцен при инсталировании — довольно дороговато. А так же, до версии 4.0 — плохо работает InteractiveLoader. Если его вынести в другой поток или чекать каждые 2-3 кадра — грузит долго сцены. А классические load, фризит всю сцену, пока не загрузится. (я сталкнулся с этой проблемой, когда сделал брендовый сплейшскрин, с анимациями и озвучкой, и пока оно проигрывается — ресурсы грузятся в пул ресурсов). Если юзаю InteractiveLoader и вызываю у него poll(). То фризится сцена каждые пару кадров в момент вызова. По сути, пока ты не вызовишь poll(), фрагмент сцены не начнет загружаться.

                Но тут как с UE4, надо много играться с LODами и прятать все фейками. Так же движок плохо работает с GLES3 на устройствах андройд. Проблема зоопарка устройств. Например Polygon2D + Skeleton, когда ты деформируешь спрайт — на многих устройствах оно либо не отрисовывается, либо крашется. А на GLES2 оно просто не работает. Собственно сама проблема..

                На айфоне тоже не все ладно, игра работает корректно, но при выгрузке ее из памяти — любит крашить и сыпать ошибки. На которые эпл остро реагирует.

                А так движок достоин. Мы одного 1Сника за месяц пересадили на разработку игр. Плюс за счет исходного кода, я без труда интегрирую самописные in app модули и различные SDK. Когда как у юнити, приходится ждать, когда тот или иной плагин обновят или починят баг.

                Еще игровой сервер Nakama хорошо работает с движком и имеет все необходимые аддоны. Что позволяет по сути на коленке собрать клиент-сервер-сервис игру для мобилок, аля веселой фермы или матчинг сессии. Но нативный сервер еще слабоватый. Если хочешь серьезное ММО или сессионку типо шутана собрать — тут придется бэк писать самому. В этом плане UE4 в сетевом коде на голову выше.

                Еще очень плохо, что из коробки не интегрировать анимации из программы Spine, которую много юзают аниматоры. А плагины, что портируют Spine в движок, юзают тот самый, фигово-работающий Polygon2D + Skeleton.

                Кому надо, вот черный список устройств, у которых GLES3 работает не правильно. Взято из AlienShooter, у них та же проблема :)
                black list
                ; GLES3 hardware blacklist
                ; msm8974 - Qualcomm MSM8974 (Snapdragon 800)
                ; apq8074 - Qualcomm APQ8074 (Snapdragon 800)
                ; msm8274ab - Qualcomm MSM8274AB (Snapdragon 801)
                ; msm8974ab - Qualcomm MSM8974AB (Snapdragon 801)
                ; msm8974ac - Qualcomm MSM8974AC (Snapdragon 801)
                ; apq8064 - Qualcomm APQ8064 (Snapdragon S4 Pro)
                ; msm8960t - Qualcomm MSM8960T (Snapdragon S4 Pro)
                ; mpq8064 - Qualcomm MPQ8064 (Snapdragon S4 Prime)
                ; msm8905 - Qualcomm MSM8905 (Snapdragon 205)
                ; msm8208 - Qualcomm MSM8208 (Snapdragon 208)
                ; msm8210 - Qualcomm MSM8210 (Snapdragon 200)
                ; msm8909 - Qualcomm MSM8909 (Snapdragon 212)
                ; msm8226 - Qualcomm MSM8226 (Snapdragon 400)
                ; msm8926 - Qualcomm MSM8926 (Snapdragon 400)
                ; msm8928 - Qualcomm MSM8928 (Snapdragon 400)
                ; msm8916 - Qualcomm MSM8916 (Snapdragon 410, 412)
                ; msm8917 - Qualcomm MSM8917 (Snapdragon 425)
                ; msm8920 - Qualcomm MSM8920 (Snapdragon 427)
                ; mt8125 - MediaTek MT8125
                ; mt8312 - MediaTek MT8312
                ; mt6589 - Mediatek MT6589
                ; mt6737 - Mediatek MT6737
                ; mt6752 - Mediatek MT6752
                ; exynos 5410 - Samsung Exynos 5410 Octa
                ; exynos 5420 - Samsung Exynos 5420 Octa
                ; exynos 5430 - Samsung Exynos 5430 Octa
                ; omap4430 - Texas Instruments OMAP 4430
                ; omap4460 - Texas Instruments OMAP 4460
                ; omap4470 - Texas Instruments OMAP 4470
                ; z2520 - Intel Atom Z2520
                ; z2560 - Intel Atom Z2560
                ; z2580 - Intel Atom Z2580
                ; pxa988 - Marvell PXA988
                OpenGLES3HadrdwareBlacklist=msm8974,apq8074,msm8274ab,msm8974ab,msm8974ac,apq8064,msm8960t,mpq8064,msm8905,msm8208,msm8210,msm8909,msm8226,msm8926,msm8928,msm8916,msm8917,msm8920,mt8125,mt8312,mt6589,mt6737,mt6752,exynos 5410,exynos 5420,exynos 5430,omap4430,omap4460,omap4470,z2520,z2560,z2580,pxa988

                  0
                  А случаем не юзал? unigine.com/ru/products/community/advantages
                  … может такой же интересный коммент напишешь)
                    0
                    неа)
                    Не юзал
                    0
                    Если мобильные устройства, то в Godot оптимальнее работать с GLES2. Тем более для 2д, хотя там и 3д более менее, особенно если разработчик оптимизирует работу, и не собрался делать всякие «реалистичные» симуляции, огромные пространства, городить массу ненужных вычислений и так далее. По крайней мере если цель сделать доступную игру, а не накрутить навороченную графику, которую вывезут только мощные устройства. К тому же этот режим по всей видимости сохранится и дальше, а GLES3 по идее заменит Vulkan.
                    Никто не мешает использовать продвинутый рендер для мобилок, но надо понимать, что для разработчика движка этот вариант не был приоритетной задачей, поэтому не везде будет работать.
                      0
                      GLES2 с текстурами высокого разрешения, у нас почему то под ios не работает. А партиклы под GLES2 юзают CPU. Увеличивается расход батареи. В итоге приходится делить билды под андройд для GLES2, и для андройдов для GLES3, а так же под iOS под GLES3, с разными партиклами. А так же отказывать от реалистичных анимаций, если телефон не поддерживает GLES3. А на GLES2, как я сказал, Polygon2D + Skeleton на многих устройствах тупо не работает. Текстура не рендерит и сыпит тонну ошибок. Соотвествующий issue есть.
                      Вот собственно сравнение, с деформацией текстуры и без: https://youtu.be/-KKi4FZG2m8
                      В итоге на одних устройствах колышится шерсть, а на других — просто кусок текстуры или даже покадровая анимация.
                        0
                        Тут уже вопрос скорее в том, что конкретно вашему пайплайну тесно в ограничениях и особенностях текущего gles2. Чтобы не перегружать лишними партиклами прибегают к покадровым анимациям, ими же можно заменять все эти конструкции из 2д-костей и так далее.
                          0
                          ну, как бы, этот же ассет прекрасно работает на всех андройдах в GLES2, а вот на айфонах 6 и X крашится. Выяснять не стал.
                          Ну как бы 2Д кости для того и нужны, что бы не тратить память на кадры анимаций и как раз таки созданы, что бы упростить анимацию. Вон тот же Spine откройте. А тут мне такие устройства говорят «Не сегодня». Проблема известная и она решаемая. Вот выпустят godot4, там этой проблемы не будет, как обещают, и мне что, все проекты перепиливать обратно?

                          Я указал на подводные камни, чего стоит ожидать от движка. Эти камни исправляются, возможно завтра тот issue закроют и все будет круто.

                          Как и собственно обещают исправить краш на айосе, при переходе приложения в фоновый режим. Опять же, ссылка на issue выше тоже есть. Эти камни лучше занть, перед тем как начинать делать проект. А то на релизе как всплывут эти сюрпризы, как они для нас всплыли, будете потом волосы рвать на головах.
                            0
                            То, что в gles2 частицы работают на cpu — буквально в редакторе написано, это не тайное знание. А поддерживать Spine Godot вобще-то и не обязан. К тому же это опенсурс — надо что то экзотическое, так напиши. Тем более что многое таким образом уже написали и выложили в доступ.
                              0
                              в версии 3.0, небыло ParticleCPU) Партиклов просто не было для GLES2.0)
                              Об это тоже ужалились в свое время)
                            0
                            еще из подводных камней могу добавить, что пока что мало плагинов, модулей и аддонов, с различными SDK и сервисами, готовьтесь нанимать людей работающих в java и objective-c. Приходится самостоятельно писать модули на java под андройд, и под iphone. Например популярная функция на ios. requestReview. Если вы ходите сделать попрашайку лайков в игре — эпл начнет бить по рукам, отказывать в выпуске и просить юзать их функционал. godot из коробки не поддерживает этот функционал. В итоге мне пришлось писать отдельный модуль на Objective-C, с этим функционалом а так же, продвигаемые покупки в стор. А я ни java, ни Objective-C особо не знаю. Но кое как реализовал. Так что стоит за ранее учесть это, при выборе данного движка для проекта. Маленькой инди-студии возможно проще будет взять unity, под который есть все плагины и не придется добирать людей, для реализации этого функционала. Либо ждать чуда, когда добрый саморитянен выпустит такой плагин.
                            Собственно мой модуль под это дело. Если кому надо. Заменитель оригинального in app service. Но работоспособность не гарантирую, ибо dev ветка)

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое