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 实例组成的可迭代对象(例如数…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
