首页 > 其他分享 >Unity 搭建ILRuntime开发环境

Unity 搭建ILRuntime开发环境

时间:2023-11-09 09:46:46浏览次数:40  
标签:ILRuntime 解释器 项目 dll Unity net 搭建

Unity热更新目前主流的方案有: Lua, ILRuntime, puerts, huatuo方案。前两个大家都比较熟悉了,puerts 是基于TypeScript开发的热更新,huatuo是基于C#的方案。后两个大家会比较陌生。本系列分享基于ILRuntime来做热更新。

 

ILRuntime热更新原理

 

ILRuntime热更新原理是基于Unity引擎,内置一个.net 字节码解释器,解释执行.net字节码。对于开发人员而言,使用.net技术将游戏逻辑代码开发出.net标准的字节码动态库(.dll)。将.net字节码的dll放入到Unity的资源里面,然后加载这个资源文件里面的.net字节码,再用内置的解释器解析执行游戏逻辑。如果把这个”字节码.dll资源”放服务器,就可以实现更新下载,然后再装载运行。有原理可知,我们实现ILRuntime来开发项目,就可以分成2个部分:

(1):内置.net 字节码解释器到Unity游戏项目中;

(2):来创建一个.dll的.net项目工程,基于Unity引擎的.dll的库来开发游戏逻辑;

 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

第(1)部分,ILRuntime框架已经为我们实现了.net字节码解释器,我们只要将它的代码拿过来,同时在我们的项目中初始化ILRuntime虚拟机解释器。第(2)部分,我们使用.net开发工具(Microsoft visual studio)创建一个.dll的.net项目,后面我们称为”逻辑热更项目”,同时把unity引擎里面的.dll的库添加引用到逻辑热更项目中,这样我们在开发游戏逻辑的时候就能直接引用到Unity的API和相关的智能提示。这样就让c#开发的Unity开发者最大限度的保留了Unity的开发习惯,上手很快。

 

图1.1-1:热更新原理图

 

ILRuntime 开发环境搭建

 

了解了上面的原理,我们搭建ILRuntime就很好理解了,首先第(1)部分,安装ILRuntime解释器代码库,同时在项目实例化ILRuntime解释器。这里我们以Unity 2020.2.3f1版本为例,来进行环境配置讲解。很简单,先安装.net,版本要求>= 4.6.1,我用的是4.7, 然后打开Unity编辑器,点击Window菜单, 选择PackageManager, 搜索ILRuntime安装即可。如图1.1-2所示:

图1.1-2:热更新原理图

注: Packages记得选”Unity Registry”, 然后安装ILRuntime即可,同时打开Unity PlayerSetting 选unsafecode模式。安装好ILRuntime开发环境后,接下来在项目中实例化ILRuntime的解释器。编写一个ILRuntimeWrapper.cs的全局单例,引入using ILRuntime.Runtime.Enviorment;ILRuntime名字空间,在Awake中实例化ILRuntime解释器实例: this.appdomain = new ILRuntime.Runtime.Enviorment.AppDomain();

 

public class ILRuntimeWrapper : UnitySingleton<ILRuntimeWrapper>

{

  private bool isGameStart = false;

  AppDomain appdomain; //

  System.IO.MemoryStream fs;

  System.IO.MemoryStream p;

  public override void Awake() {

  base.Awake();

  this.isGameStart = false;

  this.appdomain = new     ILRuntime.Runtime.Enviorment.AppDomain();

 }

}

AppDomain,就可以理解为是全局唯一的ILRuntime的解释器对象实例,主要用它来解释执行我们的.net热更项目的.dll字节码。

接下来安装第(2)部分, 创建一个基于.net的.dll的工程项目,作为可热更的游戏逻辑项目。 (如果你懒,可以拷贝使用示例代码里面的逻辑热更项目,.net版本和你自己的保持一致即可)这个项目有几个特点:必须最终是要生成.dll的.net动态库,要加上Unity使用的依赖,所以我们专门在这个项目下创建一个文件夹UnityDlls用来存放开发中依赖Unity的动态库。如图所示:

图1.1-3:热更项目位置

图1.1-4:依赖Unity的Dll

当我们开发游戏逻辑的时候,使用了Unity的那些库,只要从我们Unity的引擎里面找到这些.dll,然后复制到UnityDlls下面,然后添加引用到热更项目工程就可以了(这样你在热更项目就可以尽情的使用Unity的API,而且还是C#的)。如何找呢?有个小技巧,你打开标准的Unity项目工程,在” Assembly-CSharp”这里的引用就能看到我们使用的Unity的.dll, 例如我们要使用动画播放组件Animation, 它在UnityEngine.AnimationModule.dll里面,你就可以复制路径,找到这个.dll,然后把这个.dll拷贝到”逻辑热更项目”的UnityDlls里面,然后在逻辑热更项目中添加这个.dll的引用。

图1.1-5:如何找到依赖的Unity的Dll的路径

图1.1-6

7.png

图1.1-7

 

配置一下生成.dll的路径,我们把这个.dll生成到Unity项目里面的StreammingAssets路径下,这样方便我们编译后直接在Unity中马上就可以执行,所以我这边在逻辑热更项目中配置输出路径,如图:

 

图1.1-8:配置输出路径到StreammingAssets/Hotfix下

这样环境就配置好了,在逻辑热更项目中开发逻辑代码,开发完成以后,逻辑热更项目生成.dll给Unity,Unity 加载.dll解释执行。

标签:ILRuntime,解释器,项目,dll,Unity,net,搭建
From: https://www.cnblogs.com/bycw/p/17819012.html

相关文章

  • Unity程序员要注意的编码规范
    Unity程序员如何写好代码,写代码的过程中要注意的哪些些点,今天给大家分享一些经验规则,通过遵守这些规则作出明智的架构决策,确保更高的团队开发效率和稳定的代码。避免抽象类我们在开发中经常喜欢抽象,其实抽象得过程中往往会产生设计过度和抽象过度,而这些抽象得代码可能会令人难以......
  • 从FrameDebugger看Unity渲染
    Unity如何渲染一个3D+2D的游戏画面,今天通过FrameDebugger来看下Unity内置渲染管线的渲染策略,后续再出一些URP渲染管线相关的文章。 Unity渲染场景的几个主要部分 Unity内置渲染管线是基于摄像机来进行渲染的,每个摄像机按照摄像机的渲染顺序来依次渲染,渲染完一个摄像机,再......
  • Redis 哨兵模式的原理及其搭建
    1.Redis哨兵Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。1.1.哨兵原理1.1.1.集群结构和作用哨兵的结构如图:哨兵的作用如下:监控:Sentinel会不断检查您的master和slave是否按预期工作。自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当......
  • codecombat搭建
    第一步:看自己的系统是不是WIN10专业版、企业版、教育版(查看方法自行百度),如果是,请跳过第二步;如果是家庭和学生版,请遵循第二步 我的是WIN11家庭版非家庭版找到这个目录专业版、教育版、企业版只需要在这个目录打开hyper-v即可就是这个                    ......
  • gitlab搭建后 用户头像不显示问题(已解决)
    参考官方解决方案地址: https://docs.gitlab.com/ee/administration/libravatar.html1.vi/etc/gitlab/gitlab.rb2. 配置文件增加如下所示的plain_url,保存并退出 3.停止gitlab服务gitlab-ctlstop4.重新加载配置文件 gitlab-ctlreconfigure5.配置加载正常后重......
  • Unity 自定义Postprocess Kawase Blur
    前言本篇将介绍如何通过添加RenderFeature实现自定义的postprocess——KawaseBlur关于RenderFeature的基础可以看这篇https://www.cnblogs.com/chenglixue/p/17816447.htmlKawaseBlur介绍因为毛神对于十大模糊算法的介绍已经整理得十分详细了,所以这里不会深入,但会大致讲讲它......
  • Unity 格子工具
     usingUnityEditor;usingUnityEngine;publicclassCustomGridWindow3:EditorWindow{privateTexture2DcustomBackgroundTexture;privateVector2gridSize=newVector2(10,10);privateColor[]cellColors;privateboolisSelecting=fal......
  • redis主从+哨兵搭建配置参考
    主节点配置:#绑定的主机地址(ip换成自己机器的地址)bind0.0.0.0#redis进程的端口号port6379#是否开启保护模式,默认开启。要是配置里没有指定bind和密码,开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码和bind,可以开启;否则最好关闭设置为no。protected-mod......
  • 搭建 Makefile+OpenOCD+CMSIS-DAP+Vscode arm-none-eabi-gcc 工程模板
    STM32F407-GCC-TemplateArm-none-eabi-gcc+Makefile+OpenOCD+CMSIS-DAP+Vscode工程模板一、本次环境搭建所用的软硬件1)WindowsorLinux(本文以Windows为主)2)JLink、Daplink、Wch-Link烧录器3)GNUArmEmbeddedToolchain交叉编译器4)Mingw-w64GCCforWindows645)Debug......
  • Unity 自定义Postprocess BSC明度饱和度对比度
    前言本篇将介绍如何通过添加RenderFeature实现自定义的postprocess——调整屏幕的明度、饱和度、对比度(以下统称BSC)关于RenderFeature的基础可以看这篇https://www.cnblogs.com/chenglixue/p/17816447.htmlShaderBrightness:很简单乘以rendertargettexture即可Saturatio......