Version: 2021.1
macOS Player: IL2CPP Scripting Backend
Delivering your application to the Mac App Store

macOS Player: C++ source code plugins for IL2CPP

You can add C++ (.cpp) code files directly into a Unity Project when using the IL2CPPA Unity-developed scripting back-end which you can use as an alternative to Mono when building projects for some platforms. More info
See in Glossary
scripting backendA framework that powers scripting in Unity. Unity supports three different scripting backends depending on target platform: Mono, .NET and IL2CPP. Universal Windows Platform, however, supports only two: .NET and IL2CPP. More info
See in Glossary
. These C++ files will act as plugins within the Plugin InspectorA Unity window that displays information about the currently selected GameObject, asset or project settings, allowing you to inspect and edit the values. More info
See in Glossary
. If you configure the C++ files to be compatible with macOS Player, Unity compiles them together with C++ code that gets generated from managed assemblies. Select the appropriate Mac OS option in the Platform settings section of the Inspector window:

Plugin importer settings for C++ files
Plugin importer settings for C++ files

Because the functions are linked together with generated C++ code, there is no separate DLL to _P/Invoke into. Due to this, you can use the “__Internal” keyword in place of the DLL name, which makes it the C++ linker’s responsibility to resolve the functions, rather than loading them at run time, as the following example shows:

[DllImport("__Internal")]
private static extern int
CountLettersInString([MarshalAs(UnmanagedType.LPWSTR)]string str);

You can define this kind of function in NativeFunctions.cpp as follows:

extern "C" __declspec(dllexport) int __stdcall CountLettersInString(wchar_t* str)
{
    int length = 0;
    while (*str++ != nullptr)
        length++;
    return length;
}

Because the linker resolves the function call, any error made in the function declaration on the managed side (i.e. C# code that executes under managed run time) produces a linker error rather than a run-time error. This also means that no dynamic loading needs to take place during run time, and the function is called directly from C#. This significantly decreases the performance overhead of a P/Invoke call.

See Also

Plugin Inspector

  • • 2018–03–13 Page published

  • New feature in 2018.1 NewIn20181

macOS Player: IL2CPP Scripting Backend
Delivering your application to the Mac App Store