您可以将__ IL2CPP__种由 Unity 开发的脚本后端,可在为某些平台构建项目时替代 Mono。更多信息
See in Glossary 用 Mono 的替代品,在为 Windows 播放器构建项目时用于编写后端脚本。
使用 IL2CPP 构建项目时,Unity 会在创建本机二进制文件之前将脚本和程序集内的 IL 代码转换为 C++。请参阅 IL2CPP 以了解更多信息。
使用 IL2CPP 脚本后端时,可将 C++ (.cpp) 代码文件直接添加到 Unity 项目中。这些 C++ 文件充当插件检视面板 (Plugin Inspector) 中的插件。如果将 C++ 文件配置为与 Windows 播放器兼容,则 Unity 会将这些文件与从托管程序集生成的 C++ 代码一起编译。
若要查看 C++ 文件的插件导入器设置,点击 .cpp 文件,在检视面板的平台设置部分选择适当的 Windows 选项:
因为函数与生成的 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++ != L'\0')
length++;
return length;
}
因为由链接器负责解析函数调用,所以在托管端的函数声明(在托管运行时执行的 C# 代码)中发生的任何错误都会生成链接器错误而不是运行时错误。这意味着,在运行时无法进行动态加载,而是直接从 C# 调用函数,从而显著降低了 P/Invoke 调用的性能开销。
Unity 使用与生成的 C++ 代码相同的 C++ 编译器参数编译源代码插件,这些参数无法修改。如果某些插件源代码需要控制 C++ 编译器参数,则必须改为构建原生插件。有关更多信息,请参阅原生插件。
使用 IL2CPP 脚本后端的项目通常会生成以下文件:
以下文件是使用 IL2CPP 的项目共有的:
| 文件: | 描述: |
|---|---|
| a_Data | 包含游戏数据的文件夹。 |
| a.exe | 主游戏可执行文件。 |
| UnityCrashHandler64.exe | 崩溃处理程序可执行文件。 |
| UnityPlayer.dll | 包含所有本机代码的 Unity Player 库。 |
| WinPixEventRuntime.dll | PIX for Windows 运行时。此文件仅存在于开发构建中。 |
| a_BackUpThisFolder_ButDontShipItWithYourGame | 包含调试游戏所需数据的文件夹,包括 PDB(调试信息)文件和脚本生成的 C++ 代码。应为发布的每个构建备份此文件夹,但不要重新分发它。 |
| GameAssembly.dll | 包含 IL2CPP 运行时和所有脚本代码的库。 |
| SymbolMap | 包含所有托管函数地址及其长度的列表的文件。IL2CPP 需要此文件来解析托管堆栈跟踪。如果将其删除,仍然可以运行游戏,但无法保证异常会生成合理的调用栈。 |