Разработчик мобильных приложений
0,2
рейтинг
8 декабря 2015 в 13:05

Разработка → Альтернатива Unity: Urho3D + C# + Xamarin tutorial

Про 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.
Егор @Nagg
карма
43,5
рейтинг 0,2
Разработчик мобильных приложений
Реклама помогает поддерживать и развивать наши сервисы

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

Самое читаемое Разработка

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

  • 0
    Точно бесплатная?
    Кое-что в лицензии меня смущает:
    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

    Может я чего-то не понимаю?
    • 0
      Это если вы хотите запустить игру на iOS/Android/Mac. Для Windows лицензия не нужна. Т.е. грубо говоря можно разрабатывать на Windows, дебажить C# и C++. А потом приобрести Indie лицензию за 25$ в месяц и запаблишить на мобилки.
      • 0
        То есть, тоже самое, что и в случае с Unity3d?
        • 0
          Никаких роялти и весь код открыт. Не знаю как сравнить это с Unity3d.
          • 0
            Просто в топике упор на «бесплатность», а по факту выходит, что лицензирование как и в Unity3d.
            • +1
              В unity полно ограничений на бесплатную версию и нет полного открытого кода. Здесь же требуется обычная лицензия на Xamarin.Android/Xamarin.iOS для которых UrhoSharp — это обычное приложение.
              • 0
                В Unity Personal Edition 5 из ограничений только стандартный splash screen, и требование купить professional версию при заработке более 100000$ при помощи их продукта за последний финансовый год.
                • 0
                  Не забывайте главный минус Personal Edition — закрытый код. Урхо давольно простой как грабли, поэтому изменить/отладить/добавить фичу не составляет никаких проблем.
      • 0
        А если я соберу это дело, чтобы работало через CoreCLR (на x86-android, например), то ограничений на использование тоже нет?
        • –1
          Хитренький! :-) Думаю нельзя, но я уточню.
          • +3
            Если нельзя, то слова про бесплатность — откровенное враньё.
            • 0
              В таком случае любой опенсорс приложений на Xamarin — ни фига не бесплатный. Для запуска любого опенсорса на Windows — вам нужны деньги на лицензию Windows. Это всё вопрос терминологии. Если станет легче — могу уточнить в статье, что сам код оригинального движка и байндинга — бесплатный.
              • 0
                Для запуска на Windows да, нужна Windows. Для кросскомпиляции Windows-приложений из Linux проприетарные технологии нужны далеко не всегда. Так что под Windows существует чистый OpenSource. Правда как тут дело с Xamarin я не в курсе.
            • +3
              Я уточнил — можно собирать.
          • –3
            Убрал слово «бесплатный» из статьи. А то люди, покусанные Столманом недовольны :-)
    • 0
      Даже если получится завести CoreCLR на Android, то эти биндинги использовать нельзя, да. А инди-лицензия (это та самая, где нельзя пользоваться Visual Studio и билдить из командной строки) у них «всего» $15 в месяц стоит на платформу.

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