Mono 和 IL2Cpp 是 Unity 让脚本实现跨平台使用的两种不同的技术,目的都是为了让游戏能够顺利的在不同平台运行。

参考:【Unity游戏开发】Mono和IL2CPP的区别 - 知乎

Mono

mono 是一个由Xamarin公司所主持的自由开放源码项目。是C# CLI 的一种实现,其主要由 C# 编译器、CLR虚拟机、核心类别程序库三个组件组成。

基本的流程

mono 实现跨平台的办法是这样的:Mono C# 编译器把代码编译成 CIL (中间语言),然后通过CLR虚拟机(类似Java的JVM,虚拟机是可以跨平台运行的)来运行CIL,达到代码跨平台的效果。

flowchart TD
    A["开发者编写Unity C#代码<br/>(游戏业务逻辑)"] --> B["Mono C#编译器<br/>(核心组件1)"]
    B --> C["编译生成CIL中间语言<br/>(Common Intermediate Language)"]
    C --> D["不同平台的CLI虚拟机<br/>(核心组件2,适配Windows/Android/iOS等)"]
    D --> E["CLI虚拟机运行CIL代码<br/>(依赖Mono核心类别程序库/核心组件3)"]
    E --> F["最终效果:Unity游戏跨平台运行"]
    
    classDef coreComponent fill:#e1f5fe,stroke:#01579b,stroke-width:2px
    class B,D,E coreComponent
    classDef endNode fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
    class F endNode

不同的编译时间

上面说到将 CIL 直接通过虚拟机运行 todo

IL2CPP

IL2CPP

flowchart TD
 A["开发者编写Unity C#代码<br/>(游戏业务逻辑)"] --> B["Unity C#编译器<br/>(生成标准CIL中间语言)"]
 B --> C["IL2CPP工具链<br/>(核心环节:CIL → 平台无关C++代码)"]
 C --> D["各平台原生编译器<br/>(Windows:MSVC | Android:GCC/Clang | iOS:Clang)"]
 D --> E["编译生成平台原生机器码<br/>(CPU可直接执行的二进制指令)"]
 E --> F["最终效果:Unity游戏跨平台原生运行"]

 classDef coreComponent fill:#fff3e0,stroke:#e65100,stroke-width:2px
 class C,D coreComponent
 classDef endNode fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px
 class F endNode