Unigine Engine — новый уникальный
Пролог
Не так давно я увидел showreel движка, который выглядит более чем конкурентно
В этой статье я максимально кратко расскажу об этом движке и косвенно сравню с прямыми конкурентами.
Немного про историю :
Все началось в 2004(!) году с Александра Запрягаева и его opensource проекта
В 2010 году вышел Heaven Benchmark на основе Unigine
В 2012 вышла спорная с точки зрения геймплея, но симпатичная OilRush
В 2017 вышла забавная индюшка
Текущее состояние
10 апреля 2020 вышла Community версия, которую можно, использовать если у вашей компании доход меньше 100к$ или для некомерческого проекта
Интерфейс
![image](https://habrastorage.org/webt/0a/hp/v5/0ahpv583edacikj83sbezadotpw.png)
Сразу хочу отметить то лучшее что ребята взяли от Unreal engine: доступ ко всем необходимым свойствам объекта вроде LOD, Render, Collision etc.
![image](https://habrastorage.org/webt/x6/bd/8s/x6bd8sl9r6pf2nxjbume52r307m.png)
В меню просмотра сцены есть удобный дебаг рендера:
![image](https://habrastorage.org/webt/sa/hg/sr/sahgsrzs3lgidfgy7lvxq49nrwm.png)
Иерархия сцены построена странно, в ней есть отдельно материалы на сцене, отдельно объекты:
![image alt](https://habrastorage.org/webt/68/h-/18/68h-18olgfy15xracz3d8w8u4bo.png)
![image alt](https://habrastorage.org/webt/ps/q_/1n/psq_1ngk3wvsbizys7p1s-ma95w.png)
К минусам хочется отнести то, что нельзя одновременно открыть две сцены, так же система вкладок далека от Unreal engine с точки зрения удобства.
Снизу находиться обычный asset browser и консоль, которые такие же как и везде
Хотелось бы отметить странный показатель папки, в которой ты сейчас находишься
Скриптинг и апи
пример кода на с#
using Unigine;
namespace UnigineApp
{
class AppWorldLogic : WorldLogic
{
/* .. */
public override bool Update()
{
// getting current controls
Controls controls = Game.Player.Controls;
// checking controls states and reporting which buttons were pressed
if (controls.ClearState(Controls.STATE_FORWARD) != 0 || controls.ClearState(Controls.STATE_TURN_UP) != 0)
{
Log.Message("FORWARD or UP key pressed\n");
}
else if (controls.ClearState(Controls.STATE_BACKWARD) != 0 || controls.ClearState(Controls.STATE_TURN_DOWN) != 0 )
{
Log.Message("BACKWARD or DOWN key pressed\n");
}
else if (controls.ClearState(Controls.STATE_MOVE_LEFT) != 0 || controls.ClearState(Controls.STATE_TURN_LEFT) != 0 )
{
Log.Message("MOVE_LEFT or TURN_LEFT key pressed\n");
}
else if (controls.ClearState(Controls.STATE_MOVE_RIGHT) != 0 || controls.ClearState(Controls.STATE_TURN_RIGHT) != 0 )
{
Log.Message("MOVE_RIGHT or TURN_RIGHT key pressed\n");
}
return true;
}
}
}
и на с++
#include
/* .. */
int AppWorldLogic::update()
{
// getting current controls
ControlsPtr controls = Game::getPlayer()->getControls();
// checking controls states and reporting which buttons were pressed
if (controls->clearState(Controls::STATE_FORWARD) || controls->clearState(Controls::STATE_TURN_UP))
{
Log::message("FORWARD or UP key pressed\n");
}
else if (controls->clearState(Controls::STATE_BACKWARD) || controls->clearState(Controls::STATE_TURN_DOWN))
{
Log::message("BACKWARD or DOWN key pressed\n");
}
else if (controls->clearState(Controls::STATE_MOVE_LEFT) || controls->clearState(Controls::STATE_TURN_LEFT))
{
Log::message("MOVE_LEFT or TURN_LEFT key pressed\n");
}
else if (controls->clearState(Controls::STATE_MOVE_RIGHT) || controls->clearState(Controls::STATE_TURN_RIGHT))
{
Log::message("MOVE_RIGHT or TURN_RIGHT key pressed\n");
}
return 1;
}
Tак выглядит логика среды выполнения, в принципе ничего необычного
![image](https://habrastorage.org/webt/ak/on/5b/akon5bhthqbpjdbwljyu_tzyo0o.png)
на самом деле такое поверхностное сравнение не имеет смысла, но отсутвие вызова 100 библиотек и 10 пространств имен ради простых вещей меня уже радует, чисто визуально код выглядит лаконично и названия классов имено такие какие ждешь что лично меня опять же радует. Поработаю месяц на движке и расскажу подробнее или нет, потому что куда веселее
рассказать о разработке под мобильный vr
Платформы
- Windows
- linux и OSX
- VR: steamvr
- Обещают android, ios, playstation, etc…, но не понятно по датам
Рендер — шейдинг — vfx
Сцена на 500к полигонов с кучей неплохих vfx бегает в 300+fps даже на моем скромном ноутбучном железе
Particicle editor
![image](https://habrastorage.org/webt/3e/11/bj/3e11bjxv_ftxqz2s8n7uu-tlcm8.png)
Внутри есть все для создания современного pbr, причем работает во вьюпорт все быстрее чем в UE4
Просто робот из примера от разработчиков движка:
![image](https://habrastorage.org/webt/ot/vh/ob/otvhobazyko8qwk0wcfatkv74fw.png)
А вот так выглядит низкие настройки графики в понимании авторов в уже собранном проекте
![image](https://habrastorage.org/webt/g6/k8/jf/g6k8jfrugz7iyggmzyhoeeeobka.png)
Кстати внутри компании есть собственного алгоритм:
[Practical Cascaded Shadow Maps](https://developer.download.nvidia.com/SDK/10.5/opengl/src/cascaded_shadow_maps/doc/cascaded_shadow_maps.pdf)
Чего в нем хорошего?
- много примеров, гайдов и референс кода
- годная поддержка всех современных фичей от nvidia про которые надо писать отдельной статьей
- сравнительно низкий порог вхождения несмотря на то что UI все еще сырой
Эпилог
Сейчас Unigine хоть и сырой, и не поддерживает основные платформы, но уже выглядит многообещающие, и возможно через несколько лет вместе с Unreal Engine и Unity в один ряд встанет и Unigine.
Дополнительные ссылки
[большое интервью](https://secretmag.ru/trends/players/unigine.htm)
[мигрантам с unreal engine ](https://developer.unigine.com/ru/docs/2.11/migration/from_ue/? rlang=cpp)
[мигрантам с unity engine](https://developer.unigine.com/ru/docs/2.11/migration/from_unity/? rlang=cpp)