在为 Windows 播放器构建项目时,您可以使用 IL2CPP 作为 脚本后端为 Unity 中的脚本提供动力的框架。Unity 根据目标平台支持三种不同的脚本后端:Mono、.NET 和 IL2CPP。但是,通用 Windows 平台仅支持两种:.NET 和 IL2CPP。更多信息
参见 术语表 的替代方案。
使用 IL2CPP 构建项目时,Unity 会在创建原生二进制文件之前将来自 脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性并以任何您喜欢的方式响应用户输入。更多信息
参见 术语表 和程序集的 IL 代码转换为 C++。有关更多信息,请参阅 IL2CPPUnity 开发的脚本后端,您可以在为某些平台构建项目时将其用作 Mono 的替代方案。更多信息
参见 术语表。
使用 IL2CPP 脚本后端时,您可以将 C++ (.cpp) 代码文件直接添加到 Unity 项目中。C++ 文件充当 Plugin 检查器一个 Unity 窗口,显示有关当前选定的游戏对象、资源或项目设置的信息,允许您检查和编辑值。更多信息
参见 术语表 中的插件。如果将 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++ 编译器参数编译源代码插件,这些参数无法修改。如果某些 插件在 Unity 之外创建的一组代码,用于在 Unity 中创建功能。您可以在 Unity 中使用两种类型的插件:托管插件(使用 Visual Studio 等工具创建的托管 .NET 程序集)和原生插件(特定于平台的原生代码库)。更多信息
参见 术语表 源代码需要控制 C++ 编译器参数,则必须构建原生插件。有关更多信息,请参阅 原生插件一个特定于平台的原生代码库,在 Unity 之外创建,用于在 Unity 中使用。允许您访问诸如操作系统调用和第三方代码库之类的功能,否则这些功能将无法用于 Unity。更多信息
参见 术语表。
使用 IL2CPP 脚本后端的项目通常会生成以下文件。
以下文件是使用 IL2CPP 的项目的通用文件。
文件 | 描述 |
---|---|
a_Data | 包含游戏数据的文件夹。 |
a.exe | 主游戏可执行文件。 |
UnityCrashHandler64.exe | 崩溃处理程序可执行文件。 |
UnityPlayer.dll | 包含所有原生代码的 Unity 播放器库。 |
WinPixEventRuntime.dll | 用于 Windows 的 PIX 运行时。此文件仅存在于 开发版本开发版本包含调试符号并启用分析器。更多信息 参见 术语表 中。 |
a_BackUpThisFolder_ButDontShipItWithYourGame | 包含调试游戏所需的数据的文件夹,包括 PDB(调试信息)文件和从脚本生成的 C++ 代码。您应该为发布的每个版本备份此文件夹,但不要重新分发它。 |
GameAssembly.dll | 包含 IL2CPP 运行时和所有脚本代码的库。 |
SymbolMap | 包含所有托管函数地址及其长度的列表的文件。IL2CPP 需要此文件来解析托管堆栈跟踪。如果您删除它,您仍然可以运行游戏,但不能保证异常会生成合理的调用堆栈。 |