Unity3D ILRuntime开发原则与接口绑定详解
引言
ILRuntime是一款基于C#的热更新框架,使用IL2CPP技术将C#代码转换成C++代码,支持动态编译和执行代码,适用于Unity3D的所有平台,包括Android、iOS、Windows、Mac等。本文将详细介绍ILRuntime在Unity3D中的开发原则及接口绑定技术,并提供相关代码示例。
对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!
ILRuntime基本开发原则
- 理解两个不同执行环境:
- ILRuntime的逻辑热更项目中的类不能直接继承Unity C#项目中的类,Unity C#项目中也不能直接识别逻辑热更项目中开发的“组件类”。
- Unity C#的对象实例与接口在逻辑热更项目中不能直接new出来,需要通过Unity C#项目传递过来或直接调用Unity C#项目的接口生成。
- 逻辑热更项目的功能:
- 逻辑热更项目主要负责代码逻辑,使用Unity做好的资源、Unity引擎与Unity C#项目提供的基础服务。
- 热更新时,将逻辑热更项目生成的.dll当作二进制资源进行更新。
- ILRuntime项目的启动流程:
- 启动Unity C#的代码,下载并加载最新的逻辑代码.dll(逻辑热更项目生成)。
- ILRuntime解释器解释执行逻辑代码.dll,进入逻辑代码的入口。
- 逻辑代码使用底层的资源、Unity组件与底层C#开发的接口。
接口绑定技术详解
ILRuntime通过生成绑定代码,使得逻辑热更项目可以调用Unity引擎的API。这一技术主要依赖于.NET的.dll和ILRuntime的绑定机制。
- 绑定代码生成:
- 在进行.dll开发时,如果调用了其他.dll库,生成.dll时会为调用的接口做一个“符号”。
- 运行时,根据符号加载依赖的.dll,然后重定向这些符号,使得在调用时能够跳到正确的函数。
- 具体实现步骤:
- 安装ILRuntime插件,导入Unity3D。
- 创建一个热更新脚本,继承
ILRuntime.Runtime.CLRBinding.BindingCodeGenerator,并实现GenerateBindingCode方法。 - 在Unity3D中,通过菜单栏的
Tools->ILRuntime->Generate CLR Binding Code生成绑定代码。
代码实现
以下是一个简单的例子,演示如何使用ILRuntime进行热更新及接口绑定。
- 创建热更新脚本:
| using System; | |
| using System.Collections.Generic; | |
| using ILRuntime.Runtime.CLRBinding; | |
| public class HotfixCodeGenerator : BindingCodeGenerator | |
| { | |
| public override IEnumerable<Type> GetTypesToGenerate() | |
| { | |
| return new Type[] { typeof(int), typeof(string) }; | |
| } | |
| public override IEnumerable<MethodInfo> GetMethodsToGenerate() | |
| { | |
| return null; | |
| } | |
| public override IEnumerable<PropertyInfo> GetPropertiesToGenerate() | |
| { | |
| return null; | |
| } | |
| public override IEnumerable<FieldInfo> GetFieldsToGenerate() | |
| { | |
| return null; | |
| } | |
| public override IEnumerable<EventInfo> GetEventsToGenerate() | |
| { | |
| return null; | |
| } | |
| public override IEnumerable<Type> GetCrossBindingTypes() | |
| { | |
| return null; | |
| } | |
| } |
- 生成绑定代码:
- 在Unity3D中,打开菜单栏的
Tools->ILRuntime->Generate CLR Binding Code,选择刚才创建的热更新脚本HotfixCodeGenerator.cs,点击Generate按钮生成绑定代码。
- 创建HotfixManager脚本:
| using System.Collections; | |
| using System.Collections.Generic; | |
| using System.IO; | |
| using UnityEngine; | |
| using ILRuntime.Runtime.Enviorment; | |
| public class HotfixManager : MonoBehaviour | |
| { | |
| private static HotfixManager instance; | |
| public static HotfixManager Instance | |
| { | |
| get | |
| { | |
| if (instance == null) | |
| { | |
| instance = FindObjectOfType<HotfixManager>(); | |
| } | |
| return instance; | |
| } | |
| } | |
| private AppDomain appDomain; | |
| private void Awake() | |
| { | |
| instance = this; | |
| } | |
| public void Init() | |
| { | |
| appDomain = new AppDomain(); | |
| string dllPath = Application.streamingAssetsPath + "/Hotfix.dll"; | |
| if (File.Exists(dllPath)) | |
| { | |
| byte[] dllBytes = File.ReadAllBytes(dllPath); | |
| MemoryStream dllStream = new MemoryStream(dllBytes); | |
| appDomain.LoadAssembly(dllStream); | |
| } | |
| } | |
| public object Invoke(string typeName, string methodName, object[] args) | |
| { | |
| object obj = appDomain.Instantiate(typeName); | |
| return appDomain.Invoke(methodName, obj, args); | |
| } | |
| } |
- 在游戏启动时初始化ILRuntime并加载DLL:
| void Start() | |
| { | |
| HotfixManager.Instance.Init(); | |
| // 其他初始化代码 | |
| } |
- 调用热更新代码:
| void Update() | |
| { | |
| if (Input.GetKeyDown(KeyCode.Space)) | |
| { | |
| // 假设有一个热更新中的方法名为"HotfixMethod",没有参数 | |
| HotfixManager.Instance.Invoke("Namespace.ClassName", "HotfixMethod", null); | |
| } | |
| } |
结论
ILRuntime为Unity3D提供了一种高效的热更新方案,通过生成绑定代码,使得逻辑热更项目能够调用Unity引擎的API。本文详细介绍了ILRuntime的基本开发原则、接口绑定技术,并提供了具体的代码实现示例,希望能够帮助开发者更好地理解和应用ILRuntime。
更多教学视频
Unity3D
www.bycwedu.com/promotion_channels/2146264125
相关文章:
Unity3D ILRuntime开发原则与接口绑定详解
引言 ILRuntime是一款基于C#的热更新框架,使用IL2CPP技术将C#代码转换成C代码,支持动态编译和执行代码,适用于Unity3D的所有平台,包括Android、iOS、Windows、Mac等。本文将详细介绍ILRuntime在Unity3D中的开发原则及接口绑定技术…...
闻泰科技涨停-操盘训练营实战-选股和操作技术解密
如上图,闻泰科技,今日涨停,这是前两天分享布局的一个潜伏短线的标的。 选股思路: 1.主图指标三条智能辅助线粘合聚拢,即将选择方向 2.上图红色框住部分,在三线聚拢位置,震荡筑底,…...
我用AI学Android Jetpack Compose之开篇
最近突发奇想,想学一下Jetpack Compose,打算用Ai学,学最新的技术应该要到官网学,不过Compose已经出来一段时间了,Ai肯定学过了,用Ai来学,应该问题不大,学习过程记录下来,…...
25考研王道数据机构课后习题-----顺序表链表部分
文章目录 1.顺序表题目2.链表相关题目3.我的个人总结 声明:以下内容来自于B站知名up主白话拆解数据结构,望获悉; 1.顺序表题目 下面的这个说的是:下面的哪一个是组成我们的顺序表的有限序列,这个应该是数据元素&#x…...
新能源电动汽车动力电池技术
新能源电动汽车动力电池技术是新能源汽车发展的核心之一,以下是动力电池技术的一些关键方面: 技术进展 能量密度提升:近年来,动力电池的能量密度有了显著提升,从2010年的100Wh/kg提高到2024年的300Wh/kg。能量密度的…...
修复 ITunes 在 Windows 或 Mac 上不断崩溃的问题 [100% 有效]
对于 iDevice 用户来说,只能通过 iTunes 在 iDevice 和计算机之间传输文件的困境一直是一个紧迫的问题。所有 iPhone 用户可能都知道,iTunes 并不是一款高效的应用程序,有时性能会很差,例如在 iDevices 和计算机之间传输文件时不断…...
Android设备使用AOA协议进行主机与配件模式通信
1.使用TYPC-C数据线连接两台华为手机: TYPE-C线,先连接下图右边的ACCESSORY 再连接左边的HOST 此时左边的HOST(白色) 会给右边的ACCESSORY(黑色) 充电 接着打开左连接的HostChart会自动调起授权,然后会启动右边的AccessoryChart USB HOS…...
Python爬虫入门实例:Python7个爬虫小案例(附源码)
引言 随着互联网的快速发展,数据成为了新时代的石油。Python作为一种高效、易学的编程语言,在数据采集领域有着广泛的应用。本文将详细讲解Python爬虫的原理、常用库以及实战案例,帮助读者掌握爬虫技能。 一、爬虫原理 爬虫,又…...
生成对抗网络 (Generative Adversarial Network, GAN) 算法MNIST图像生成任务及CelebA图像超分辨率任务
生成对抗网络 (Generative Adversarial Network, GAN) 算法详解与PyTorch实现 目录 生成对抗网络 (Generative Adversarial Network, GAN) 算法详解与PyTorch实现1. 生成对抗网络 (GAN) 算法概述1.1 生成器与判别器1.2 GAN的优势2. GAN的核心技术2.1 目标函数2.2 生成器2.3 判别…...
快速排序排序方法演示及算法分析(附代码和实例)
基本思想: 任取一个元素(比如第一个)为中心,称为枢轴(pivot)所有比它小的元素一律前放,比它大的元素后放,形成左右两个子表对各子表重新选择中心元素并以此规则调整直到每个子表的元…...
库迪困境:供应链补救失效背后的市场错配
作者 | 曾响铃 文 | 响铃说 近日,红餐网证实了库迪咖啡暂停便捷店招商的消息。库迪官方回应称,店中店模式招商只是按下了暂停键,不排除未来重启的可能。 但一批被“暂停”的便捷店加盟商,不知道等不等起库迪的未来重启。 小红…...
解决openpyxl操纵带公式的excel或者csv之后,pandas无法读取数值的问题
1 功能特点 openpyxl: 这是一个专门用于操作Excel文件(.xlsx/.xlsm)的库。它提供了丰富的功能来读取、写入和修改Excel文件的各个元素,如单元格、行、列、工作表等。例如,可以通过openpyxl轻松地创建一个新的Excel工作…...
基于傅立叶神经网络(FNN)与物理信息神经网络(PINN)求解泊松方程(附Pytorch源代码)
基于傅立叶神经网络(FNN)与物理信息神经网络(PINN)求解泊松方程 一、引言 偏微分方程(Partial Differential Equation, PDE)在科学与工程领域有着广泛的应用。传统数值方法(如有限差分法、有限元法)在求解这类问题时,尽管已经非常成熟,但随着问题复杂度的增加,其计…...
小程序组件 —— 28 组件案例 - 推荐商品区域 - 实现结构样式
这一节目标是实现底部推荐商品的结构和样式,由于这里要求横向滚动,所以需要使用上节介绍的 scroll-view 功能,并使用 scroll-x 属性支持横向滚动,推荐商品区域中的每一个商品是一个单独的 view,每个view 中需要写三个组…...
Flink读写Kafka(DataStream API)
在Flink里,已经预定义了kafka connector,使用该connector我们可以读写kafka,并且能实现exactly once的语义。 要使用需要引入相关的maven依赖,在这里,因为读写kafka,就会涉及一个问题,kafka-client和broker的版本兼容问题,不过因为kafka client和broker的双向兼容的良…...
SCAU期末笔记 - 数据库系统概念往年试卷解析
数据库搞得人一头雾水,题型太多太杂,已经准备摆烂了。就刷刷往年试卷,挂不挂听天由命。 2019年 Question 1 选择题 1. R ∩ S R∩S R∩S等于一下哪个选项? 画个文氏图秒了 所以选A. R ∩ S R − ( R − S ) R∩SR-(R-S) R∩…...
flutter在windows平台中运行报错
PS D:\F\luichun> flutter run当运行flutter项目时,【解决如下报错】 /C:/flutter/packages/flutter/lib/src/painting/star_border.dart:530:27: Error: The getter Matrix4 isnt defined for the class _StarGenerator.- _StarGenerator is from package:flut…...
HTML——75. 内联框架
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>内联框架</title><style type"text/css">iframe{width: 100%;height: 500px;}</style></head><body><!--iframe元素会创建包含…...
python对mongodb的增删查改
python对mongodb的增删查改 1. 安装 pymongo2. 连接 MongoDB3. 创建(插入)文档插入单个文档插入多个文档 4. 查询文档查询单个文档查询多个文档复杂查询嵌套查询分页条件查询(通用模版) 5. 更新文档更新单个文档更新多个文档更新嵌…...
【JS】期约的Promise.all()和 Promise.race()区别
概述 Promise.all() 和 Promise.race() 都是 JavaScript 中处理多个异步操作的 Promise 方法,但它们的行为和返回结果有所不同。 Promise.all()和Promise.race() 1. Promise.all() Promise.all() 接受一个由多个 Promise 实例组成的可迭代对象(例如数…...
Z-Score标准化:从数学原理到机器学习实战
1. 为什么我们需要Z-Score标准化? 第一次接触机器学习数据预处理时,我对着各种标准化方法一头雾水。直到在实战项目中踩了几个坑才明白,Z-Score标准化就像是给不同国家的货币做汇率转换——把欧元、美元、日元都换算成人民币,才能…...
轻松三步:为Mem Reduct内存监控工具设置中文界面
轻松三步:为Mem Reduct内存监控工具设置中文界面 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct 如果你正…...
别再死记硬背公式了!用Python+ADS仿真,5分钟搞定L型阻抗匹配电路设计
用PythonADS自动化设计L型阻抗匹配电路:从理论到一键生成 在射频工程实践中,阻抗匹配是每个工程师必须掌握的核心技能。传统方法依赖手工计算和Smith圆图操作,不仅耗时费力,还容易出错。本文将展示如何结合Python脚本和Keysight …...
别再只盯着Kafka了:基于RocketMQ的SOFAMQ,在金融级高可用架构上做了哪些关键增强?
金融级消息中间件的进化:SOFAMQ如何重塑高可用架构标准 在分布式系统架构中,消息队列如同血管般连接着各个业务模块,其稳定性直接决定了整个系统的生命力。当大多数技术团队还在将Kafka、RabbitMQ作为默认选项时,金融行业早已对消…...
乙巳马年春联生成终端GPU算力适配:显存优化实现毫秒级开门响应
乙巳马年春联生成终端GPU算力适配:显存优化实现毫秒级开门响应 1. 项目背景与挑战 每到新春佳节,贴春联是家家户户的传统习俗。随着技术的发展,用AI生成个性化春联已经成为一种新颖的互动方式。我们开发的“皇城大门春联生成终端”正是这样…...
用2SK241 JFET给智能车做个“顺风耳”:150kHz导航信号放大实战(附NanoVNA调谐避坑)
基于2SK241 JFET的150kHz导航信号高灵敏度接收方案设计与实战 在智能车竞赛和电子设计类赛事中,150kHz导航信号的可靠接收一直是决定系统性能的关键环节。传统基于双极型晶体管(BJT)的选频放大方案不仅调试复杂,还容易因寄生参数引发自激振荡。本文将展示…...
如何轻松编辑暗黑破坏神2存档:d2s-editor可视化编辑器完整指南
如何轻松编辑暗黑破坏神2存档:d2s-editor可视化编辑器完整指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为复杂的暗黑破坏神2存档文件格式而烦恼吗?d2s-editor为您提供了一个直观、易用的Web界…...
抖音批量下载器:5分钟打造你的专属素材库
抖音批量下载器:5分钟打造你的专属素材库 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量…...
别再只接电阻了!ITR9909反射光电管驱动能力不足?试试这颗BC517达林顿管的补救方案
光电传感器驱动困境破解:从ITR9909到BC517的实战升级方案 在电子DIY和自动化控制领域,反射式光电传感器因其非接触检测特性被广泛应用。但许多初学者在初次使用ITR9909这类反射光电管时,常会遇到一个令人困惑的问题——明明按照典型电路连接了…...
如何免费解锁VMware的macOS虚拟化限制:完整技术解析与实践指南
如何免费解锁VMware的macOS虚拟化限制:完整技术解析与实践指南 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/un/unlocker 引言:跨越平台壁垒的技术桥梁 在虚拟化技术日益成熟的今天ÿ…...
