文档

Unity Engine

Unity Engine

Windows 播放器:IL2CPP 脚本后端

Use IL2CPP with Windows Player and add compatible C++ source code plug-ins to your build.
阅读时间4 分钟最后更新于 1 个月前

您可以将 IL2CPP 用 Mono 的替代品,在为 Windows 播放器构建项目时用于编写后端脚本。
使用 IL2CPP 构建项目时,Unity 会在创建本机二进制文件之前将脚本和程序集内的 IL 代码转换为 C++。请参阅 IL2CPP 以了解更多信息。

适用于 IL2CPP 的 C++ 源代码插件

使用 IL2CPP 脚本后端时,可将 C++ (.cpp) 代码文件直接添加到 Unity 项目中。这些 C++ 文件充当插件检视面板 (Plugin Inspector) 中的插件。如果将 C++ 文件配置为与 Windows 播放器兼容,则 Unity 会将这些文件与从托管程序集生成的 C++ 代码一起编译。
若要查看 C++ 文件的插件导入器设置,点击 .cpp 文件,在检视面板的平台设置部分选择适当的 Windows 选项:

关于 C++ 文件的插件导入器设置

因为函数与生成的 C++ 代码链接在一起,所以没有单独的 DLL 可进行
_P/Invoke
调用。因此,可使用
“__Internal”
关键字代替 DLL 名称,从而使 C++ 链接器负责解析函数,而不是在运行时加载函数,如下例所示:
[DllImport("__Internal")]private static extern intCountLettersInString([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 脚本后端的项目通常会生成以下文件:

构建期间生成的 IL2CPP 文件

以下文件是使用 IL2CPP 的项目共有的:

文件:

描述:

a_Data包含游戏数据的文件夹。
a.exe主游戏可执行文件。
UnityCrashHandler64.exe崩溃处理程序可执行文件。
UnityPlayer.dll包含所有本机代码的 Unity Player 库。
WinPixEventRuntime.dllPIX for Windows 运行时。此文件仅存在于开发构建中。
a_BackUpThisFolder_ButDontShipItWithYourGame包含调试游戏所需数据的文件夹,包括 PDB(调试信息)文件和脚本生成的 C++ 代码。应为发布的每个构建备份此文件夹,但不要重新分发它。
GameAssembly.dll包含 IL2CPP 运行时和所有脚本代码的库。
SymbolMap包含所有托管函数地址及其长度的列表的文件。IL2CPP 需要此文件来解析托管堆栈跟踪。如果将其删除,仍然可以运行游戏,但无法保证异常会生成合理的调用栈。

其他资源: