news 2026/6/6 19:10:22

Unity HybirdCLR 简单了解 笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Unity HybirdCLR 简单了解 笔记

1、关于 IL2CPP

① 字面意思:

IL2CPP的字面意思很直白:

IL(Intermediate Language,中间语言)to(到)CPP(C++ 语言)

就是:"将中间语言转换为 C++ 代码"


② 大致流程:

你写的C#代码(.cs 文件)先被编译成IL(.dll 程序集),然后在项目构建(Build)时,IL2CPP 会读取这些 IL 代码,把它转换成庞大的C++源文件,最后再用平台自带的 C++ 编译器(如 MSVC、Clang、GCC)生成原生的机器码(.exe、.so、.a 或 .app)。


③ 实现的主要目的:

覆盖苹果IOS、WebGL平台:iOS 平台禁止 JIT 编译,只允许运行原生机器码。IL2CPP 提前生成原生二进制的方式(AOT编译),契合 iOS 的要求。同时,它也适用于 WebGL 等无法使用 JIT 的平台。


实现一个 IL 到 C++ 转换器,难度极高;IL2CPP 也并不是基于某个现成的开源项目改出来的,而是 Unity 官方从零开始、投入大量顶尖工程师自主设计和实现的。


2、关于 HybirdCLR

大致实现思路:

HybridCLR 是在 IL2CPP的 "IL 转 C++"这个步骤里,向C++ 代码里注入了一套解释器的实现代码。让 IL2CPP运行时接纳热更新代码。它是对IL2CPP的魔改。


3、 在Unity打包时,HybirdCLR具体是如何 “劫持” IL2CPP 的?

先了解 Unity 用 IL2CPP 打包时的 具体步骤:

  1. Unity 先启动一个Mono 环境mono.exe)。

  2. 在这个环境里,运行我们的主角il2cpp.exe

  3. 把编译好的C# 代码(.dll 文件)作为“原料”喂给它。

  4. il2cpp.exe经过一系列复杂的分析和转换,最终在指定的输出文件夹里,生成海量的.cpp.h文件

  5. 最后,Unity 再调用平台自带的 C++ 编译器(比如 MSVC 或 Clang),把这些 .cpp 文件编译成最终的机器码,也就是你能玩到的游戏程序

关键在第2步上,这个il2cpp.exe(IL-C++)的转换器,就藏在你的 Unity 安装目录里。

具体路径如下:

  • WindowsUnity安装目录\Editor\Data\il2cpp\

  • macOSUnity安装目录\Contents\Frameworks\il2cpp\build\

HybridCLR 的具体步骤是:

具体操作是:

  1. 拿到源码:拿到了il2cpp.exe的源代码。

  2. 植入代码:在源码的关键位置(比如处理类型、方法的函数里),插入大量的“拦截”判断。

  3. 重新编译:把修改后的源码,编译成一个全新的、定制版的il2cpp.exe

  4. 放回原位:用这个定制版,替换掉 Unity 目录里那个官方的il2cpp.exe


4、HybridCLR 直接改了Unity安装目录的il2cpp.exe ??

那不想用了怎么办?怎么改回来?

注意:

HybridCLR 并没有 直接改动 你电脑上 Unity 安装目录里的il2cpp.exe


它的工作方式很简单:(在你HybridCLR-Installer 时)把Unity官方的 il2cpp 文件夹复制一份到你项目的HybridCLRData目录里,然后在这个副本上做手脚。 打包时,通过 Unity开放的环境变量接口让编译器去读项目里的这个“魔改版”。

Unity完全支持IL2CPP路径指向自己的exe在手册中明确提到了这个环境变量:IL2CPP_ADDITIONAL_ARGS。这说明 Unity 在设计 IL2CPP 时,刻意保留了让外部程序可以干预编译流程的接口

注意的是,不是改动全局变量,而仅仅是Unity进程内的变量,这样能保证即使另开一个Unity项目,没有安装HybridCLR,也不会调用HybridCLR魔改后的il2cpp.exe

  • 全局变量

    • 作用范围:整个操作系统。所有正在运行和将来会运行的程序都能读到它。

    • 修改方式:通常需要管理员权限,通过系统的"环境变量"设置界面修改。

    • 持久性:修改后永久生效,直到你再次手动修改。重启电脑都还在。

    • 潜在风险:如果你用这种方式把UNITY_IL2CPP_PATH指向了魔改版,那么你电脑上所有 Unity 项目、所有版本的 Unity 编辑器,在打包时都会去用那个魔改版。这会严重扰乱其他项目的正常打包。

  • 进程内变量 (HybridCLR 使用的方式):

    • 作用范围只影响当前正在运行的、安装了 HybridCLR 的这个 Unity 编辑器进程

    • 修改方式:不需要任何管理员权限,HybridCLR 的脚本在 Unity 内部直接调用System.Environment.SetEnvironmentVariable完成。

    • 持久性不持久。只要这个 Unity 编辑器进程关闭(你关掉 Unity 软件),这个修改就彻底消失,仿佛从未存在过。

    • 安全性:非常安全。它完全不会干扰你同时打开的其他 Unity 项目,也不会干扰你电脑上的任何其他程序,包括其他版本的 Unity 编辑器

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 19:08:44

太阳能充电控制器拆解:从PWM原理到成本控制与可靠性分析

1. 项目概述:一次对太阳能充电控制器的深度“体检” 最近在整理工作室的备件库,翻出来几个之前项目剩下的太阳能充电控制器。这玩意儿在光伏小系统里,比如庭院灯、监控摄像头供电、房车或者户外移动电源里,是个核心但常被忽视的部…

作者头像 李华
网站建设 2026/6/6 19:07:51

完整基于 Java 的商业系统包含哪些组件?深度分析

很多人理解 Java 商业系统时,容易把它简单等同于“Spring Boot 后端 MySQL 数据库 Vue 管理后台”。但真正能用于商业环境的系统,远不止这些。一个完整的 Java 商业系统,本质上是一套围绕业务闭环、技术架构、数据存储、安全风控、运维监控…

作者头像 李华
网站建设 2026/6/6 19:07:03

人工智能专业术语详解(F)

在人工智能与机器学习的术语表中,以字母F开头的五个核心概念——特征(Feature)、特征选择(Feature Selection)、特征学习(Feature Learning)、前馈神经网络(Feed-Forward Neural Net…

作者头像 李华
网站建设 2026/6/6 19:06:06

计网实验 交换机及其VLAN的配置

实验目的1. 掌握VLAN(虚拟局域网)的基本概念和创建方法,理解VLAN在网络隔离中的作用。2. 学会在交换机上配置VLAN,将指定以太网端口分配到目标VLAN,完成VLAN端口的基础配置。3. 掌握VLAN接口的创建及IP地址配置方法&am…

作者头像 李华
网站建设 2026/6/6 19:03:35

从原理到调参:深入理解Matlab中envelope函数的‘坑’与hilbert变换的本质

从原理到调参:深入理解Matlab中envelope函数的‘坑’与hilbert变换的本质在信号处理领域,包络分析是一个看似简单却暗藏玄机的操作。许多工程师第一次使用Matlab的envelope函数或hilbert变换时,往往会惊讶于它们在不同场景下表现出的差异——…

作者头像 李华