Skip to content

mrkriv/UnrealDotNet

Repository files navigation

UnrealDotNet

UnrealDotNet - это плагин для Unreal Engine 4 позволяющий исполнять код на языке С#.

Помимо вызова статических методов из с++/Вlueprint, плагин позволяет взаимодействовать с объектами движка и наследоваться от таких классов как AActor, ACharacter, USceneComponent и т.д. Поддерживается переопределение виртуальных методов и работа с событиями, такими как OnComponentEndOverlap. Плагин позволяет перезагружать сборки c# без перезапуска движка.

Демонстрация работы (видео довольно старое):

Не используйте это в продакшене!!!

Настроенный проект

Скачать настроенный проект Win64 UE 4.20 + dotnet 2.1.8

Настроить самому

  1. Скачиваем этот проект
  2. Скачиваем и устанавливаем net core runtime
  3. Копируем папку с coreclr.dll (примерно в C:\Program Files\dotnet\shared\Microsoft.NETCore.App\..\ в Plugins\UnrealDotNet\Binaries\Win64\dotenet_clr)
  4. Каким либо образом находим Newtonsoft.Json.dll и кидаем в Plugins\UnrealDotNet\Binaries\Win64\dotenet_libs
  5. Собираем HotReloadUtilit из проекта Plugins\UnrealDotNet\Source\SharpUtilites.sln
  6. Проверяем что Plugins\UnrealDotNet\Source\UnrealEngineSharp\NativeManager.cs:17 правильное имя С++ сборки
  7. Компилируем GameLogic.sln
  8. Запускаем DotUnrealExample.uproject

Поддерживается версия движка 4.20. Однако плагин легко переносится на другие версии движка. Для перехода на другую версию необходимо заново сгенерировать обертки при помощи CodeGeneretor. После этого возможно придётся отредактировать CodeGenerator.json и HeaderScanList.txt для отключения компонентов вызывающих проблемы.

!!! На данный момент компиляция проекта вне редактора сломана, и придётся в ручную копировать папки и использовать бубен.

Roadmap

Реализовано:

  • Создание C# классов, наследованных от AActor
  • Горячая перезагрузка C# кода
  • Отладка C# кода
  • Вызов статичных методов из C++ и Blueprint
  • Вызов простых методов C++ и Blueprint из C#
  • Компиляция для Win64

Частично реализовано:

  • Переопределение виртуальных методов
  • Взаимодействие с классами UE4
  • Взаимодействие со структурами UE4
  • Взаимодействие с перечислениями UE4
  • Взаимодействие со свойствами объектов UE4
  • Редактирование публичных свойств из редактора UE4

Описание работы

Взаимодействие с с++ происходит при помощи P/Invoke, для этого на основе заголовочных файлов движка генерится куча export методов в с++ и c# библиотека UnrealEngine.dll для вызова этих методов. Для большинства наследников UObject создаются manage классы. Они необходимы для корректного наследования от этих классов в c#. Так же создаются копии перечислений и структур для работы с движком. Кроме того плагин поддерживает работу с событиями. Генерацией этих оберток занимается CodeGeneretor.

Схема взаимодействия

Плагин использует среду выполнения net core clr, на данный момент поддерживается только Win64. При запуске движка выполняется загрузка CLR в приложение, далее в него загружаются управляемые сборки.

Для каждого объекта в c# создается обертка, содержащая только адрес реального объекта и его тип. Все обращения к свойствам или методам являются P/Invoke вызовами. При создании экземпляра manage класса происходит создание объекта в ue4 и его обертки в c#.