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

image

Что это за зверь?


Не будет преувеличением сказать, что Urho3D по возможностям сопоставим с Unity3D и работать с ним так же легко. При этом он бесплатен без каких-либо оговорок (лицензия MIT), доступен для многих платформ (Windows, Linux, Mac OS X, Android, iOS, Raspberry Pi, HTML5), невероятно быстр и легковесен. Позволяет писать игры на AngelScript (синтаксис похож на C#), LUA и C++. Если вы заинтересовались, то добро пожаловать под кат.

Где взять?


Официальный сайт Urho3D: http://urho3d.github.io. Однако движок активно развивается, и текущая версия убежала далеко вперед от выложенного на сайте релиза. Поэтому настоятельно рекомендую качать движок из репозитория: https://github.com/urho3d/Urho3D.

set "PATH=C:\Programs\Git\bin"
git clone https://github.com/urho3d/Urho3D.git

Для сборки движка потребуется CMake. Параметры, которые советую включить:

image

  • URHO3D_OPENGL — использовать OpenGL вместо DirectX (только для Windows)
  • URHO3D_STATIC_RUNTIME — библиотеки Visual C++ статически линкуются в движок, что гарантирует запуск игры на копьютере пользователя, даже если у него не установлен распространяемый пакет vcredist* (только для VS)
  • URHO3D_SAMPLES — нет лучшего способа освоить движок, чем изучать примеры

Консольная команда (для Visual Studio 2015):

set "PATH=C:\Programs\Cmake\bin"
call Urho3D/cmake_vs2015.bat Build -DURHO3D_OPENGL=ON -DURHO3D_SAMPLES=ON -DURHO3D_STATIC_RUNTIME=ON

Как обычно, требованием для консольного CMake в Windows является отсутствие пробелов в пути к движку.

Остальные параметры можно посмотреть тут: http://urho3d.github.io/documentation/HEAD/_building.html#Build_Options.

После того, как проекты будут сгенерированы, их нужно скомпилировать. Опять же, на примере VS откройте Build/Urho3D.sln и скомпилируйте проект ALL_BUILD (движок вместе с примерами) или проект Urho3D (только движок). Если вы планируете писать игры на C++, то лучше компилировать в двух конфигруациях (Debug и Release). Если будете использовать только скрипты, то достаточно Release.

Компиляция из консоли (для Visual Studio 2015):

set "PATH=D:\Programs\Microsoft Visual Studio 14.0\Common7\Tools\;C:\Windows\System32"
call vsvars32.bat
devenv Build/ALL_BUILD.vcxproj /build Release

По завершении компиляции скопируйте папки CoreData и Data из Urho3D/bin в Build/bin.

Посмотреть в действии


В папке Build/bin находятся скомпилированные версии примеров (на данный момент их 41). Возможности движка, которые они демонстрируют: создание 2D и 3D приложений, скелетная анимация, физика (Bullet и Box2D), работа с сетью, воспроизведение звуков, внутриигровой интерфейс, локализация и многое другое. Исходники этих примеров находятся в папке Urho3D/Source/Samples.

Все примеры помимо C++ продублированы на языках AngelScript (находятся в папке Data/Scripts) и Lua (Data/LuaScripts). Для их запуска предназначен лаунчер Build/bin/Urho3DPlayer.exe.

Запуск примера в окне 800x600:

Urho3DPlayer.exe Data/Scripts/23_Water.as -x 800 -y 600 -w

image

Если запускать лаучнер без параметров, то в качестве аргументов командой строки используется содержимое файла Data/CommandLine.txt. Все параметры лаунчера можно посмотреть тут: http://urho3d.github.io/documentation/HEAD/_running.html.

Привет, мир!


Создадим простое приложение на языке AngelScript. Несколько подготовительных шагов:

  1. В пустую папку скопируйте лаунчер Urho3DPlayer.exe.
  2. Переименуйте лаунчер, чтобы пользователь понимал, что именно его нужно запускать (например в Game.exe).
  3. Сюда же скопируйте папку CoreData. Эта папка содержит необходимые для работы движка данные (шейдеры и прочее).
  4. Создайте папку Data. В ней будут содержаться ресурсы нашей игры.
  5. В папке Data создайте папку для скриптов (например Scripts) и в ней файл Main.as, в котором и будет описана логика игры.
  6. В папке Data создайте файл CommandLine.txt с содержимым «Scripts/Main.as» (без кавычек), чтобы лаунчер знал, что именно нужно запускать.

Точкой входа в программу является функция Start() запускаемого скрипта. В файл Main.as добавьте:

void Start()
{
}

Теперь запустите Game.exe. Если вы все сделали правильно, то вы должны увидеть черный экран. Закройте «игру» с помощью Alt+F4.

Сейчас я хочу немного рассказать об основной идее Urho3D. Сцены в движке являются иерархическими деревьями, состоящими из узлов/нод. Каждая нода имеет такие параметры как позиция в пространстве, угол поворота, масштаб. К любой ноде можно привязать так называемые компоненты: 3D-модели, спрайты, скрипты, источники звука, света и так далее, а также дочерние ноды, которые будут наследовать все трансформации.

Создадим сцену и камеру:

Scene@ scene_; // указатель на сцену

void Start()
{
    // Создаем новую сцену.
    scene_ = Scene();
    
    // Сцена является производым от ноды типом и к ней тоже
    // можно добавлять компоненты. Компонент Octree (октодерево)
    // необходим, если вы планируете отображать объекты сцены,
    // то есть почти всегда.
    scene_.CreateComponent("Octree");
    
    // Создаем для сцены дочернюю ноду и задаем ей имя MyCamera.
    // Имена нод можно использовать для того, чтобы искать нужный узел сцены.
    Node@ cameraNode = scene_.CreateChild("MyCamera");
    
    // Создаем камеру и прикрепляем ее к узлу.
    cameraNode.CreateComponent("Camera");
    
    // Указываем для узла с камерой положение в пространстве.
    // Координата X направлена слева направо, Y - снизу вверх, Z - от вас вглубь экрана.
    cameraNode.position = Vector3(0.0f, 0.0f, -5.0f);
    
    // Указываем движку какая камера какой сцены будет показываться на экране.
    Viewport@ viewport = Viewport(scene_, cameraNode.GetComponent("Camera"));
    renderer.viewports[0] = viewport;
}

Экран все еще черный, поэтому давайте добавим что-нибудь в сцену. Для этого нам понадобится какая-нибудь модель. В папке Data создайте папку Models и скопируйте в нее Box.mdl из Urho3D\bin\Data\Models. Загрузим модель:

void Start()
{
    ...
    // Создаем ноду для 3D-модели.
    Node@ boxNode = scene_.CreateChild("MyBox");
    
    // Создаем компонент StaticModel - простая 3D-модель без скелета.
    StaticModel@ boxObject = boxNode.CreateComponent("StaticModel");
    
    // Загружаем модель из файла.
    // Если эта модель уже была загружена ранее, то она не будет загружаться повторно.
    boxObject.model = cache.GetResource("Model", "Models/Box.mdl");
    
    // Повернем узел с кубом (все значения указываются в градусах).
    boxNode.rotation = Quaternion(45.0f, 45.0f, 45.0f);
}

Теперь на экран выводится куб, но он плохо виден, потому что освещен только стандартным фоновым освещением. Давайте добавим в сцену источник света:

void Start()
{
    ...
    // Создаем ноду для источника света.
    Node@ lightNode = scene_.CreateChild("MyLight");
    
    // Создаем источник света и прикрепляем к ноде.
    Light@ light = lightNode.CreateComponent("Light");
    
    // Указываем тип источника света - солнечный свет.
    light.lightType = LIGHT_DIRECTIONAL;
    
    // Указываем направление света.
    lightNode.direction = Vector3(0.6f, -0.6f, 0.8f);
}

И, наконец, давайте заставим наш куб вращаться:

void Start()
{
    ...
    // Определяем функцию, которая будет вызываться каждый кадр.
    SubscribeToEvent("Update", "HandleUpdate");
}

// Обработчик события Update.
void HandleUpdate(StringHash eventType, VariantMap& eventData)
{
    // Сколько времени прошло с предыдущего кадра.
    float timeStep = eventData["TimeStep"].GetFloat();
    
    // Находим ноду с нашим кубом.
    Node@ boxNode = scene_.GetChild("MyBox");
    
    // Поворачиваем ее.
    boxNode.Rotate(Quaternion(10.0f * timeStep, 10.0f * timeStep, 10.0f * timeStep));
}

Публикация игры


Допустим, мы хотим продать нашу замечательную игру, но не хотим, чтобы кто-то копался в ее исходниках. Воспользуемся утилитой ScriptCompiler.exe, которая находится в папке Build\bin\tool:

ScriptCompiler.exe Data/Scripts/Main.as

На выходе получаем Main.asc. Исправляем файл CommandLine.txt: «Scripts/Main.asc», а исходный файл Main.as убираем подальше. Дополнительным плюсом этого является более быстрый запуск игры.

Итоговый результат можно скачать тут: https://github.com/1vanK/Urho3DHabrahabr01.
Документация: http://urho3d.github.io/documentation/HEAD/index.html.

Комментарии (35)


  1. TheRabbitFlash
    28.08.2015 12:47
    +13

    Спасибо! А то про юнити уже уморили статьи, как будто ничего другого нет.


    1. olegchir
      04.09.2015 07:02
      -1

      Неплохо бы услышать детальный разбор преимуществ. Т.е. вот я хочу выпустить игру, почему мне стоит выбрать Urho вместо Unreal или Unity. Например, у Unity есть огромное преимущество в том, что на C# быстрее говнокодить, чем на C++, и вся копипаста уже есть на Stackoverflow.

      Как в Urho обстоят дела с экспортом анимаций из 3dsmax и блендера? Какие-то другие внешние тулзы?

      Простая проверка на вшивость: если он такой хороший, почему на нем нету игр? Для какой игры его изначально создавали? Если на нем никто еще не делал игру, нет ли риска, что workflow не отлаженный, и вместо выпуска игры получится очередная допилка движка.

      Из статьи пока показано главное преимущество: MIT, т.е. уважение свободы пользователей. Т.е. на этом можно не стремаясь делать игрушки под линукс (в смысле, стим-машину).


      1. 1vanK
        04.09.2015 14:03

        Уф, не думаю, что смогу написать под вашим комментарием новую статью. Цель моей статьи в первую очередь в том, чтобы общественность вообще узнала о существовании такого движка. «Говнокодить» на C++ не обязательно, вы бы хоть статью прочитали. Из блендера анимация экспортируется великолепно, есть специальный плагин для экспорта. С другими редакторами я не работал, но судя по форуму, fbx работает нормально. Про импорт из других форматов можно почитать тут: urho3d.github.io/documentation/HEAD/_tools.html. Urho3D использует Open Asset Import Library: вот список форматов assimp.sourceforge.net/main_features_formats.html Также понимает форматы движка Ogre, Spriter (http://www.brashmonkey.com/spriter.htm), Tiled (http://www.mapeditor.org/), даже автор Tiled чего-то там патчил github.com/urho3d/Urho3D/pull/850, может еще что-то запамятовал из форматов.

        Для какой игры его создавали, я не в курсе. Все движки для какой-то игры создаются? Вот огр для какой игры создавался? Или Irrlicht? А Unity?

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


        1. 1vanK
          04.09.2015 15:47
          +1

          Да и вообще, лично я бы хотел видеть в сообществе Urho3D энтузиастов, способных не только самостоятельно разыскать нужную им информацию, но и внести свой вклад. А паразитирующим на чужом труде «говнокодерам», клепающим очередную «говноподелку» из копипаст на Stackoverflow, которым нужно все разжевать и положить в рот и которые даже не могут осознать прочитанное я бы посоветовал оставаться на Unity. Эти товарищи не делают погоды ни в каком сообществе. Извиняюсь, если я изложил свою позицию несколько грубовато.


  1. AlexandrDP
    28.08.2015 12:49
    -4

    Из маленького минуса
    Авира ругается
    www.virustotal.com/ru/file/5fba6f56898035b1cc727509928b9a5722bd93d5445c06aabf0faa3567802528/analysis


  1. 1vanK
    28.08.2015 13:20
    +2

    Я даже е-мейл не могу отправить в их замечательную компанию :)

    Форма на сайте


    1. Voiddancer
      28.08.2015 17:00

      Попробуйте убрать точку из адреса.
      Почтовый сервер всё равно её откидывает.


      1. 1vanK
        28.08.2015 17:14

        Я пробовал другой е-мейл, похоже, ему не нравится домен ru :)


        1. 1vanK
          28.08.2015 17:18

          На gmail.com он тоже ругается, видимо нужно быть зарегистрированным пользователем антивируса.


          1. 1vanK
            30.08.2015 16:48

            Через гугл нашел форму: analysis.avira.com/en/submit
            Отреагировали достаточно быстро — через сутки:
            analysis.avira.com/en/status?uniqueid=sVNE5WHSpX2gPwWkcnT41rvWO6WwYxQM&incidentid=1919063
            Но на Virustotal видимо базы еще не обновились, поэтому пока еще ругается.


  1. domix32
    28.08.2015 14:24

    Еще бы информацию как это запускать на андроидах/айфонах не помешало добавить.



  1. northicewind
    28.08.2015 16:24

    Спасибо. Очень интересный движок. А есть примеры готовых игр на Urho3D?


    1. 1vanK
      28.08.2015 16:34
      +2

      Вместе с движком поставляется простая игра NinjaSnowWar (AngelScript)
      Ремейк игры Codename: Outbreak (Venom) www.gamedev.ru/community/urho3d/forum/?id=194783 (C++)
      Аркада github.com/LucKeyProductions/heXon (C++)
      Платформер urho3d.wikia.com/wiki/USP_-_Urho_Sample_Platformer (C++)
      Леталка github.com/MonkeyFirst/FH (C++)


      1. northicewind
        28.08.2015 16:42

        Спасибо. Было бы интересно сравнить детальнее с Unity или Godot. Я так понял редактор это своего рода средство расставить объекты на сцене. А вся разработка игры ведется кодом во внешнем редакторе?


        1. 1vanK
          28.08.2015 16:55
          +1

          Редактор очень похож на редактор Unity. В нем можно создать сцену целиком, настроить физику, привязать к нодам скрипты, излучатели частиц и запустить. Текст скриптов пишется в любом внешнем редакторе.


          1. northicewind
            28.08.2015 17:02

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


            1. 1vanK
              28.08.2015 17:07

              Не совсем так, я сам не так давно заинтересовался этим проектом, ну и отправил туда несколько патчей :)


      1. AlexanderG
        01.09.2015 13:55

        Ой, а можете поподробнее рассказать про ремейк Venom? Играть возможно? Отчаялся уже запустить оригинал на чем-либо.


        1. 1vanK
          01.09.2015 14:23

          Да нет, там один уровень без врагов, просто демонстрация движка.


  1. kesn
    28.08.2015 18:13
    +1

    Как раз искал недавно хоть какой-нибудь игровой движок, который бы поддерживался новым (относительно) языком nim. И вот как раз нашёл только Urho3d. Стоит заметить, что автор языка специально допиливал компилятор нима, чтобы работал Urjo3d. Так что определённо есть что-то в этом движке.


    1. xGromMx
      28.08.2015 18:19

      А где тут Nim?



  1. xGromMx
    28.08.2015 18:17

    Из бесплатного и открытого есть довольно крутой движок paradox3d.net который позволяет писать еще и горячие скрипты.


    1. northicewind
      28.08.2015 18:33

      У него лицензия GPL v3. Так что нужно будет покупать, если не хотите исходники выкладывать.


      1. Karroplan
        30.08.2015 13:52
        +1

        и для того чтоб деплоить приложения на мобильные платформы нужна лицензия xamarin


  1. Alex10
    28.08.2015 23:27

    А как у Urho3d обстоят дела с импортом в WebGL?


    1. 1vanK
      28.08.2015 23:39

      Насколько я знаю, поддержка HTML5 была добавлена совсем недавно и еще находится в стадии экспериментальной. Но онлайн демки можно посмотреть тут: urho3d.github.io/HTML5-samples.html


      1. 1vanK
        28.08.2015 23:42

        Чтобы мышь захватывалась, нужно открыть демку на весь экран.


      1. 1vanK
        28.08.2015 23:50

        И да, он использует WebGL


  1. TheRabbitFlash
    29.08.2015 01:30

    Да простят меня Боги…
    Что мешало авторам этого движка название методов взять из ECMA-Script спецификации?

    Вот это, например,
    SubscribeToEvent(«Update», «HandleUpdate»);

    Было бы круче в таком виде:

    addEventListener(Event.UPDATE, HandleUpdate);


    1. 1vanK
      29.08.2015 01:40

      С разработчиками можно пообщаться на офф форуме urho3d.prophpbb.com


    1. Nagg
      29.08.2015 12:25
      +4

      А почему они должны были это делать? Тем более они нигде не используют lowerCamelCase.
      По поводу Event.UPDATE — вы имеете ввиду enum? Там можно создавать свои события (к примеру для ремоута) — смотрите пример 17_SceneReplication


      1. Morozov_5F
        01.09.2015 01:43

        Имеется в виду, видимо, что-то похожее на ActionScript. Знакомые методы и прочее. И тут я согласен — действительно удобное именование


        1. 1vanK
          04.09.2015 16:33

          Просто там AngelScript, а не ActionScript :)