Вы можете добавлять файлы кода C++ (.cpp) непосредственно в проект Unity при использовании класса IL2CPPРазработанный Unity сервер сценариев, который можно использовать в качестве альтернативы Mono при создании проектов для некоторых платформ. Подробнее
См. в Словарь серверная часть сценариевСреда, обеспечивающая работу сценариев в Unity. Unity поддерживает три различных бэкэнда для сценариев в зависимости от целевой платформы: Mono, .NET и IL2CPP. Однако универсальная платформа Windows поддерживает только два: .NET и IL2CPP. Подробнее
См. в Словарь. Эти файлы C++ будут действовать как плагины в InspectorA Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройках проекта. , что позволяет просматривать и редактировать значения. Подробнее
См. в Словарь. Если вы настроите файлы C++ для совместимости с macOS Player, Unity скомпилирует их вместе с кодом C++, созданным из управляемых сборок. Выберите соответствующий параметр Mac OS в разделе Настройки платформы окна Инспектора:
Поскольку функции связаны друг с другом сгенерированным кодом C++, нет отдельной DLL для _P/Invoke
. В связи с этим вы можете использовать ключевое слово “__Internal”
вместо имени DLL, что возлагает на компоновщика C++ ответственность за разрешение функций, а не загрузку их во время выполнения. , как показано в следующем примере:
[DllImport("__Internal")]
private static extern int
CountLettersInString([MarshalAs(UnmanagedType.LPWSTR)]string str);
Вы можете определить функцию такого типа в NativeFunctions.cpp следующим образом:
extern "C" __declspec(dllexport) int __stdcall CountLettersInString(wchar_t* str)
{
int length = 0;
while (*str++ != nullptr)
length++;
return length;
}
Поскольку компоновщик разрешает вызов функции, любая ошибка, допущенная в объявлении функции на управляемой стороне (т. е. код C#, который выполняется в управляемой среде выполнения), приводит к ошибке компоновщика, а не к ошибке времени выполнения. Это также означает, что во время выполнения не требуется динамической загрузки, а функция вызывается непосредственно из C#. Это значительно снижает нагрузку на производительность вызова P/Invoke
.