【问题标题】:Is Unity3d native API via IL2CPP feasible?通过 IL2CPP 的 Unity3d 原生 API 可行吗?
【发布时间】:2015-05-03 21:22:55
【问题描述】:

我正在考虑访问 Unity3d 的原生 API 并可能创建一个包装库以方便人类使用。为此,我目前正试图弄清楚在打开 IL2CPP 标志的构建期间将 Unity 项目转换为 XCode 项目时究竟会发生什么。

我想知道当 IL2CPP 将 IL 转换为 c++ 时发生的确切过程是什么,为什么项目仍然包含 DLL,以及最终编译过程有什么特别之处,例如魔法发生在哪里?

欢迎对所描述目标(Unity3d c++ API)的可行性提出任何见解和意见。

PS: 我知道这样的 API 至少可以说是骇人听闻的,是的,我确实理解,除了 Unity3d 之外,还有其他技术允许将 c++ 用作一等公民,即虚幻引擎。这个问题首先是理论上的。那,我也喜欢 c++ :)

【问题讨论】:

    标签: c++ unity3d il2cpp


    【解决方案1】:

    不,IL2CPP 脚本后端没有公开来自 Unity 的新原生 API。

    实际上,这里并没有太多的魔法。工具链是这样的。

    1. 使用 Mono 编译器从用户 Unity 项目中的 C# 代码生成 IL 程序集。
    2. 从程序集中剥离未使用的 IL 以转换为 C++(这有助于我们减少精细代码和二进制大小)。
    3. 使用 IL2CPP 从 IL 程序集生成 C++ 代码。
    4. 使用适用于本机平台的 C++ 编译器编译 C++ 代码(iOS 上的 Xcode,WebGL 上的 Emscripten)

    使用 Mono 脚本后端和 IL2CPP 脚本后端输出到 Xcode for iOS 之间的唯一区别是 Xcode 项目中包含哪些文件。对于 IL2CPP,所有生成的 C++ 文件都包含在内。

    无论您使用哪种脚本后端,Unity 的 API 都不会改变。

    【讨论】:

    • 那么,它基本上将整个统一引擎和用户脚本转换为 c++?我认为unity内部是基于c++的引擎,而c#只是一种脚本语言。
    • 是否可以以某种自定义方式使用生成的类型?例如 - 实例化 SpriteRenderer 转换类或其他统一类的实例?
    • 你是对的,Unity 引擎的大部分是 C++。 IL2CPP 对该代码没有任何影响。它将任何 IL 代码(通常从 C#)转换为 C++。更正确的说法是 IL2CPP 仅将用户脚本转换为 C++。在生成的 C++ 代码中使用这些类型并不容易,因为生成的代码并不是可扩展的。例如,对脚本代码的更改可能会以意想不到的方式更改生成代码中的类型名称。
    • 经过进一步思考 - 转换后的用户脚本如何与底层统一引擎交互?如果我们可以得到生成的用户脚本使用的统一类型的接口,那么它就是——一个理论上可以使用的 c++ api。
    • Unity 引擎中的托管代码由 IL2CPP 与用户脚本一起转换。所以 Unity 引擎没有稳定的 API。我想可以使用 Unity 引擎托管程序集中生成的 C++ 代码,但这不是 Unity 将支持的。通过 il2cpp.exe 对代码生成进行轻微更改(每个版本都会发生这种情况),很容易破坏您将使用的 Unity 引擎 API。
    猜你喜欢
    • 1970-01-01
    • 2016-06-22
    • 2023-01-27
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多