Про Urho3D уже писали на хабре, это полностью открытый 3D-движок на языке С++ с редактором и интересным набором 3rd parties: Box2D, Bullet, kNet, Recast/Detour, SDL, FreeType и т.п. У движка есть редактор (написанный на нем же), но к сожалению, он далеко от Unity, зато есть другие плюсы (о них далее). Движок имеет очень аккуратный API, что стало причиной обращения взгляда Xamarin для использования кодогенератора (С++ API to C#) для генерации байндингов поверх API на языке C#. В результате получился движок (UrhoSharp) со следующими плюсами (по сравнению с тем же Unity):
Оригинальный 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Д сцена:
Из проекта CocosSharp былинагло скопированы одолжены Actions которые позволяют строить красивые сложные анимации декларативно в стиле «поверни объект на столько градусов за столько секунд, затем передвинь его туда-то параллельно уменьшая размера». Выглядит это как-то так:
Эти действия можно группировать, запускать параллельно и обрамлять в easing functions.
В качестве примера:
Что означает «увечить масштаб с 0 до 1 за 1 секунду используя EaseBounceOut easing. Затем начнем бесконечное вращение по оси Х 90 градусов за 1 секунду.
Процесс генерации довольно непрост и, если есть интерес, я могу раскрыть его в отдельной статье. Пока могу лишь в общих словах рассказать алгоритм:
Таким образом обеспечивается покрытие около 100% публичного C++ API.
Репозиторий проекта и примеров можно найти на github.
- Полная поддержка последней версии 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 были
// уменьшить масштаб до 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.
Suvitruf
Точно бесплатная?
Кое-что в лицензии меня смущает:
Может я чего-то не понимаю?
Nagg
Это если вы хотите запустить игру на iOS/Android/Mac. Для Windows лицензия не нужна. Т.е. грубо говоря можно разрабатывать на Windows, дебажить C# и C++. А потом приобрести Indie лицензию за 25$ в месяц и запаблишить на мобилки.
Suvitruf
То есть, тоже самое, что и в случае с Unity3d?
Nagg
Никаких роялти и весь код открыт. Не знаю как сравнить это с Unity3d.
Suvitruf
Просто в топике упор на «бесплатность», а по факту выходит, что лицензирование как и в Unity3d.
Nagg
В unity полно ограничений на бесплатную версию и нет полного открытого кода. Здесь же требуется обычная лицензия на Xamarin.Android/Xamarin.iOS для которых UrhoSharp — это обычное приложение.
bytex
В Unity Personal Edition 5 из ограничений только стандартный splash screen, и требование купить professional версию при заработке более 100000$ при помощи их продукта за последний финансовый год.
Nagg
Не забывайте главный минус Personal Edition — закрытый код. Урхо давольно простой как грабли, поэтому изменить/отладить/добавить фичу не составляет никаких проблем.
kekekeks
А если я соберу это дело, чтобы работало через CoreCLR (на x86-android, например), то ограничений на использование тоже нет?
Nagg
Хитренький! :-) Думаю нельзя, но я уточню.
kekekeks
Если нельзя, то слова про бесплатность — откровенное враньё.
Nagg
В таком случае любой опенсорс приложений на Xamarin — ни фига не бесплатный. Для запуска любого опенсорса на Windows — вам нужны деньги на лицензию Windows. Это всё вопрос терминологии. Если станет легче — могу уточнить в статье, что сам код оригинального движка и байндинга — бесплатный.
DeXPeriX
Для запуска на Windows да, нужна Windows. Для кросскомпиляции Windows-приложений из Linux проприетарные технологии нужны далеко не всегда. Так что под Windows существует чистый OpenSource. Правда как тут дело с Xamarin я не в курсе.
Nagg
Я уточнил — можно собирать.
Nagg
Убрал слово «бесплатный» из статьи. А то люди, покусанные Столманом недовольны :-)
kekekeks
Даже если получится завести CoreCLR на Android, то эти биндинги использовать нельзя, да. А инди-лицензия (это та самая, где нельзя пользоваться Visual Studio и билдить из командной строки) у них «всего» $15 в месяц стоит на платформу.
1vanK
На исходники лицензия MIT, почему нельзя? Хотя я не юрист и могу ошибаться )
kekekeks
Ну вот у них в одном месте MIT, а в другом вот это — download.xamarin.com/content/licenses/UrhoSharp.rtf
И поди разбери, какая из них настоящая.
1vanK
Вот тут пояснение, почему разные лицензии www.gamefromscratch.com/post/2015/12/07/Xamarin-Change-UrhoSharp-License-to-MIT.aspx