Про Urho3D уже писали на хабре, это полностью открытый 3D-движок на языке С++ с редактором и интересным набором 3rd parties: Box2D, Bullet, kNet, Recast/Detour, SDL, FreeType и т.п. У движка есть редактор (написанный на нем же), но к сожалению, он далеко от Unity, зато есть другие плюсы (о них далее). Движок имеет очень аккуратный API, что стало причиной обращения взгляда Xamarin для использования кодогенератора (С++ API to C#) для генерации байндингов поверх API на языке C#. В результате получился движок (UrhoSharp) со следующими плюсами (по сравнению с тем же Unity):

  • Полная поддержка последней версии Mono 4.2.x, C# 6.0/F# с Xamarin Studio / Visual Studio — грубо говоря это обычное приложение с шаблонами проектов для Visual Studio
  • Открытый код (однако, для запуска на iOS и Android понадобится как минимум Xamarin Indie лицензия поскольку именно Xamarin используется на этих ОС в качестве платформы)
  • Наличие C# (Xamarin) контролов, которые могут быть интегрированы в существующие неигровые приложения.
  • Все плюшки оригинального движка, описанные в большом списке тут.
  • Распространяется через Nuget который содержит базовые ассеты и native библиотеки что делает его легко подключаемым
  • Отличная производительность, минимальный оверхед от .NET/Mono




Эй, псс… не хочешь немного примеров?


Оригинальный Urho3D при помощи Emscripten запустили в WebGL, так что примеры можно глянуть даже через браузер, но работают они не шибко стабильно. Лучше посмотреть те же самые примеры на C# склонировав репозиторий и запустив на интересующей платформе. Примеры работают на всех основных платформах: Windows, Mac, iOS и Android.

Несколько скриншотов примеров:

Ландшафт (карта высот) и вода:


Скелетная анимация:


Физика 3D (Bullet)


Физика 2D (Box2D)


Управление толпой (поиск пути для толпы — raycast / pathfinding / detour):


Встраивание в существующие обычные Xamarin(Forms) приложения:


И многое другое (около 40 примеров, включая собственный от Xamarin) – копию игры ShootySkies.

Немного кода примеров:


Urho3D имеет типичную нодо-компонентную архитектуру. C# API практически копирует C++ код за исключением добавления сахара: свойств, событий, async/await. Вот так выглядит простейшая 3Д сцена:

public class HabraSample : Application
{
    protected override void Start()
    {
        // 3D scene with Octree
        var scene = new Scene(Context);
        scene.CreateComponent<Octree>();

        // Box
        var boxNode = scene.CreateChild();
        boxNode.Position = new Vector3(x: 0, y: 0, z: 5);
        boxNode.SetScale(2f);
        boxNode.Rotation = new Quaternion(x: 60, y: 0, z: 30);
        var boxModelComponent = boxNode.CreateComponent<StaticModel>();
        boxModelComponent.SetMaterial(ResourceCache.GetMaterial("Materials/BoxMaterial.xml"));
        boxModelComponent.Model = ResourceCache.GetModel("Models/BoxModel.mdl");

        // Light
        Node lightNode = scene.CreateChild(name: "light");
        var lightComponent = lightNode.CreateComponent<Light>();
        lightComponent.LightType = LightType.Point;
        lightComponent.Range = 50;

        // Camera
        Node cameraNode = scene.CreateChild(name: "camera");
        Camera cameraComponent = cameraNode.CreateComponent<Camera>();

        // Viewport
        Renderer.SetViewport(0, new Viewport(Context, scene, cameraComponent, null));
    }
}

Из проекта CocosSharp были нагло скопированы одолжены Actions которые позволяют строить красивые сложные анимации декларативно в стиле «поверни объект на столько градусов за столько секунд, затем передвинь его туда-то параллельно уменьшая размера». Выглядит это как-то так:

// уменьшить масштаб до 0.5 за 1 секунду игрового времени
await boxNode.RunActionsAsync(new ScaleTo(duration: 1f, scale: 0.5f));
// передвинуть на новую позицию за 2 секунды
await boxNode.RunActionsAsync(new MoveBy(duration: 2f, position: new Vector3(x: 5, y: 0, z: 0)));
// перекрасить в желтый
await boxNode.RunActionsAsync(new TintTo(duration: 1f, red: 1, green: 1, blue: 0));

Эти действия можно группировать, запускать параллельно и обрамлять в easing functions.
В качестве примера:

boxNode.SetScale(0); // сделаем нулевой масштаб для ящика
await boxNode.RunActionsAsync(new EaseBounceOut(new ScaleTo(duration: 1f, scale: 1)));
await boxNode.RunActionsAsync(new RepeatForever(
	new RotateBy(duration: 1, deltaAngleX: 90, deltaAngleY: 0, deltaAngleZ: 0)));

Что означает «увечить масштаб с 0 до 1 за 1 секунду используя EaseBounceOut easing. Затем начнем бесконечное вращение по оси Х 90 градусов за 1 секунду.



Генерация C# для C++ кода


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

  • Компилирование всего C++ кода в PCH файл (AllUrho.cpp)
  • При помощи проприетарной либки (враппер над Clang AST), которой скармливается этот PCH мы получаем дерево классов/членов (AST) С++ кода в виде managed объектов.
  • Генерируем DllImport для всех методов всех публичных классов (на этом этапе возникает много мелких нюансов). Но в целом проект генератора получился простой (не слишком красивый, т.к. писался в стиле «быстро-быстро и в продакшн»).

Таким образом обеспечивается покрытие около 100% публичного C++ API.

Репозиторий проекта и примеров можно найти на github.

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


  1. Suvitruf
    08.12.2015 14:30

    Точно бесплатная?
    Кое-что в лицензии меня смущает:

    You may only use the Software, as expressly permitted herein, in conjunction with Your Primary Xamarin Software. As used herein, “Your Primary Xamarin Software” means Xamarin.iOS software or Xamarin.Android software that is both (a) covered by a separate valid Xamarin software license agreement under which You are the licensee (Your “Primary Xamarin License”) and (b) for which You have acquired an Indie license, Business license, or Enterprise license under Your Primary Xamarin License

    Может я чего-то не понимаю?


    1. Nagg
      08.12.2015 14:34

      Это если вы хотите запустить игру на iOS/Android/Mac. Для Windows лицензия не нужна. Т.е. грубо говоря можно разрабатывать на Windows, дебажить C# и C++. А потом приобрести Indie лицензию за 25$ в месяц и запаблишить на мобилки.


      1. Suvitruf
        08.12.2015 14:35

        То есть, тоже самое, что и в случае с Unity3d?


        1. Nagg
          08.12.2015 14:36

          Никаких роялти и весь код открыт. Не знаю как сравнить это с Unity3d.


          1. Suvitruf
            08.12.2015 14:36

            Просто в топике упор на «бесплатность», а по факту выходит, что лицензирование как и в Unity3d.


            1. Nagg
              08.12.2015 14:43
              +1

              В unity полно ограничений на бесплатную версию и нет полного открытого кода. Здесь же требуется обычная лицензия на Xamarin.Android/Xamarin.iOS для которых UrhoSharp — это обычное приложение.


              1. bytex
                09.12.2015 12:10

                В Unity Personal Edition 5 из ограничений только стандартный splash screen, и требование купить professional версию при заработке более 100000$ при помощи их продукта за последний финансовый год.


                1. Nagg
                  09.12.2015 12:22

                  Не забывайте главный минус Personal Edition — закрытый код. Урхо давольно простой как грабли, поэтому изменить/отладить/добавить фичу не составляет никаких проблем.


      1. kekekeks
        08.12.2015 14:35

        А если я соберу это дело, чтобы работало через CoreCLR (на x86-android, например), то ограничений на использование тоже нет?


        1. Nagg
          08.12.2015 14:36
          -1

          Хитренький! :-) Думаю нельзя, но я уточню.


          1. kekekeks
            08.12.2015 14:39
            +3

            Если нельзя, то слова про бесплатность — откровенное враньё.


            1. Nagg
              08.12.2015 14:45

              В таком случае любой опенсорс приложений на Xamarin — ни фига не бесплатный. Для запуска любого опенсорса на Windows — вам нужны деньги на лицензию Windows. Это всё вопрос терминологии. Если станет легче — могу уточнить в статье, что сам код оригинального движка и байндинга — бесплатный.


              1. DeXPeriX
                08.12.2015 15:36

                Для запуска на Windows да, нужна Windows. Для кросскомпиляции Windows-приложений из Linux проприетарные технологии нужны далеко не всегда. Так что под Windows существует чистый OpenSource. Правда как тут дело с Xamarin я не в курсе.


            1. Nagg
              08.12.2015 15:55
              +3

              Я уточнил — можно собирать.


          1. Nagg
            08.12.2015 14:54
            -3

            Убрал слово «бесплатный» из статьи. А то люди, покусанные Столманом недовольны :-)


    1. kekekeks
      08.12.2015 14:34

      Даже если получится завести CoreCLR на Android, то эти биндинги использовать нельзя, да. А инди-лицензия (это та самая, где нельзя пользоваться Visual Studio и билдить из командной строки) у них «всего» $15 в месяц стоит на платформу.


      1. 1vanK
        08.12.2015 15:48

        На исходники лицензия MIT, почему нельзя? Хотя я не юрист и могу ошибаться )


        1. kekekeks
          08.12.2015 15:49

          Ну вот у них в одном месте MIT, а в другом вот это — download.xamarin.com/content/licenses/UrhoSharp.rtf
          И поди разбери, какая из них настоящая.


          1. 1vanK
            08.12.2015 15:50

            Вот тут пояснение, почему разные лицензии www.gamefromscratch.com/post/2015/12/07/Xamarin-Change-UrhoSharp-License-to-MIT.aspx