Nau Engine — а есть ли кубик?

Скажу сразу, движок этот мне интересен особо никогда не был. Когда релизнулся — почитал фича лист, полистал доку, плечами пожал и дальше пошёл. И ежу понятно, что чтобы догнать Юнити (или, хотя бы, Годот) нужны десятки лет и миллиарды деняк.
Но раз уж пошла такая пьянка, надо внести в обсуждение и немного объективности, а потому я решил скачать и потыкать веточкой — что же у ВК получилось сотворить, и узнать ответ на главный вопрос, волнующий всех разработчиков игр сегодня: а есть ли в Nau Engine кубик, и можно ли его поставить на сцену?

Можно! И кубик, и сферу, и даже чайник.
Можно! И кубик, и сферу, и даже чайник.

Пару слов о себе тоже дам. Разработчик игр, программист, движковый энтузиаст — люблю изучать технологии, в том числе писал свои движки поверх SDL, SFML, Raylib.
Особо глубоко я Nau Engine не копал, все мои ощущения описаны на основе 3 часов знакомства с движком.

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

Из главных проблем, кинувшихся в глаза:
1. Сложность установки. Помимо движка нужно установить Питон, зависимости для Питона, CMake, VCPKG, настроить переменные PATH и JSON-конфиги сборки. Если хоть где-то будет косяк — проект просто не соберётся, и почему — тоже не скажет (если не пробить сборку вручную с флагом --verbose, до чего тоже не каждый новичок догадается). Большая часть новоиспекаемых Нау-разработчиков отсеивается уже на этом этапе.

2. Перезапуск редактора для перекомпиляции скриптов. После каждой правки в коде - выключаешь редактор, включаешь редактор, ждё-ё-ёшь. Маразм в чистом виде, но щито поделать.

3. Минимализм и низкая функциональность редактора. Почти всё делается из кода / конфигов, редактор нужен только накидать объектов на сцену и как-то минимально их подвигать. Для конкуренции с современными движками — смешно, конечно, но у фреймворков и такого нет. ( ° ʖ °)

4. Плохая документация и API reference. В документации — ошибки, опечатки, она не обновлялась наверное с самого релиза, и если делать всё в точности по шагам из Getting Started гайда — у вас просто ничего не заработает, потому что там банально примеры настроек и кода с ошибками. Что по API reference - она поломана и неактуальна в щщи, проще залезть в репозиторий и посмотреть хедеры самостоятельно.

А теперь по тейкам автора обличения:
1. Нет кубиков, шариков, моделей, ничего нет! А они — есть. И их даже можно ставить на сцену через меню Outliner.
2. Нет ЯП. Что вообще значит "Нет ЯП"? С++ - уже не язык программирования, что ли? Да, новый компонент нужно руками создавать в .h / .cpp, регистрировать его в реестре движка, потом всё пересобирать. Неудобно, и делая игру среднего / большого размера скорее всего можно сойти с ума, но функционал-то есть. Есть и API, и привычные Start/Update методы, и инпуты, и своя математическая библиотека с векторами-лерпами. В общем-то всё, чтобы сделать какую-нибудь простенькую игру типа змейки, и никаких препятствий к этому нет.

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

Код вращателя:

#include "rotator.h" NAU_IMPLEMENT_DYNAMIC_OBJECT(MyRotator) void MyRotator::updateComponent(float dt) { NAU_LOG_WARNING("MainGameModule updateComponent root"); nau::math::Transform transform = getParentObject().getTransform(); const float angle = dt * m_speedFactor; if (m_axis == Axis::X) { transform.addRotation(nau::math::quat::rotationX(angle)); } else if (m_axis == Axis::Y) { transform.addRotation(nau::math::quat::rotationY(angle)); } else { transform.addRotation(nau::math::quat::rotationZ(angle)); } getParentObject().setTransform(transform); } void MyRotator::setRotationAxis(Axis axis) { value_changes_scope; m_axis = axis; } void MyRotator::setSpeedFactor(float factor) { value_changes_scope; m_speedFactor = factor; }

Как видно, несмотря на витиеватость С++ кода, всё довольно просто: берём трансформ, применяем модификатор, устанавливаем обратно.

В доке я так же нашёл инструкцию по подключению Lua и TypeScript как скриптовых языков вместо C++ — стало быть, такая возможность у движка уже есть, но я пока в этом не разбирался.

Выводы

Движок ли Nau Engine? Думаю, да. Годится ли он для геймдева в текущем состоянии? В каком-то виде, возможно... Но не для обычных разработчиков. Для тех, кому интересно в таком покопаться — может быть, ради спортивного интереса.
Я думаю, попробую сделать в этом движке что-нибудь осмысленное, а потом положу его на полку истории.

46
6
2
1
24 комментария