登录
首页 » C# » XLT Unity3D 热修复示例源码

XLT Unity3D 热修复示例源码

于 2020-11-27 发布
0 372
下载积分: 1 下载次数: 1

代码说明:

使用ILRuntime实现的类似XLUA功能的Unity3D下热修复BUG的解决方案请使用Unity2019.2.17f1版本打开,其他版本问题,请自行修复报错提示!Unity3D 5.x版本以下可以使用Unity4.7.2分支~ 和XLUA一样的地方和XLUA原理类似,注入和XLUA基本一致。 不一样的地方使用C#来进行代码的热更,避免项目内lua与C#代码交叉混杂,修复BUG时,需要C#一份,lua一份。 目录以及文件说明: Project-----Assets/XIL             --- 所有XIL所用到的文件----Assets/XIL/ILSource    --- ILRuntime插件源文件----Assets/XIL/Scripts      --- 注入以及初始化代码----Assets/XIL/Auto        --- 自动生成注入的代码以及自动生成的委托和函数的注册(如有此目录下的脚本报错,则可以直接删除此目录,然后重新生成委托,CLR绑定以及重新注册注入类型)----Hot                    --- 补丁源文件存放目录----Hot.sln                 --- 补丁源文件VS解决方案----DyncDll.csproj          --- 补丁项目工程文件----Data/DyncDll.dll        --- 补丁dll文件----Data/DyncDll.pdb       --- 补丁dll的调试文件使用步骤以及菜单项说明:注意:菜单项会根据是否开启热更宏而有所不同 XIL/插件/开启               -- 开启热补丁宏XIL/插件/取消               -- 关闭热补丁宏XIL/插件/PDB开启           -- 加载PDB调试文件XIL/插件/PDB取消           -- 不加载PDB调试文件XIL/注册需要热更的类        -- 生成注入所需要的成员接口XIL/取消需要热更的类        -- 清除注入所需要的成员接口XIL/一键清除                -- 清除自动生成的脚本XIL/一键生成                -- 自动生成委托注册以及注入所需要的脚本XIL/委托自动生成            -- 热更当中操作C#层的委托,需要注册委托相关的类型以及转换代码 这里可自动分析项目当中所有用到的委托,自动注册XIL/清除委托自动生成的脚本  --清除委托自动生成的脚本,删除一些C#脚本,或修改,有可能引起报错,这时可以清除掉自动生成的注册脚本XIL/CLR绑定                -- 非反射的方式调用C#层的接口,可大幅度提高运行效率,一些常用的接口可考虑在GenerateCLRBinding文件当中添加需要CLR绑定的类型。XIL/Hotfix Inject In Editor    -- 编辑器下注入接口只需要两步即可1 先开启补丁宏2 点击一键生成初始化以及资源接口1 需要在项目启动或适当位置调用初始化接口:wxb.hotMgr.Init();2 非编辑器下,需要自己创建加载文件的接口,可参考编辑器下的资源加载类EditorResLoad。生成补丁dll1 打开Hot解决方案2 替换DyncDll工程依赖UnityEngine.dll以及UnityEngine.UI.dll的文件,在目录Hot下,默认是Unity2018.2.11f1版本的,可以替换为自己项目对应的版本3 编译运行DyncDll工程,编译成功,即可在Data目录下生成补丁库。如何添加需要热更的类型:1 使用HotfixAttribute属性宏来修饰类型2 默认情况下所有类型都会被热更注入,如需要自己调整,可修改源文件ExportIL.cs里,FixMarkIL接口,自定义需要热更的类型生成静态DelegateBridge字段名称的规则 没有同名函数,则固定使用"__Hotfix_函数名"方式 有多个同名函数,对这些同名函数进行排序,排序规则如下(可参考接口wxb.Editor.Hotfix.getDelegateName的逻辑):1 参数个数少的在前2 进行字符串拼接,组成key值,规则如下"返回值全名 函数名(参数类型全名1,参数类型全名2,...)",之后通过key值比较,理论上,不同函数,key值是不会相同的 排序之后,取得对应函数在数组当中的下标来进行拼接如何,规则如下"__Hotfix_函数名_下标"的方式 为什么排序,主要是希望能够一眼看过去就知道函数对应的下标是多少,方便Hotfix,以及保证源脚本不变的情况下,每次Hotfix生成的字段名是一致的 如何替换函数一般有三种方式 通过函数名直接替换hotMgr.ReplaceFunc,可参考函数HotHelloWorld.Reg 通过自动生成的接口DelegateBridge对应的字段名,可直接使用hotMgr.ReplaceField,可参考函数HotHelloWorld.Reg 通过添加属性来自动注册,可参考脚本HotHelloWorld.cs与HotTemplate.cs,这里简单说明下, 要替换一个接口,要知道至少三个信息 替换的原类型 替换的接口对应的DelegateBridge字段的名字 热更当中,要替换的MethodInfo可添加属性ReplaceType到热更的类当中,表示此类型下的接口,默认替换的类型可添加属性ReplaceFunction到热更的接口当中,表示此接口需要替换哪个类型的哪个接口,可使用三种方式初始化1 ReplaceFunction(System.Type type) 替换type类型下同名的接口2 ReplaceFunction() 替换ReplaceType类型下同名的接口3 ReplaceFunction(string fieldNameOrTypeName), fieldNameOrTypeName值前缀不同,有不同的含义      a __Hotfix_开头,替换ReplaceType类型fieldName字段对应的接口      b 替换类型全名为fieldNameOrTypeName下同名的接口4 ReplaceFunction(System.Type type, string fieldName) 替换type类型fieldName字段对应的接口5 ReplaceFunction(string type, string fieldName) 替换类型全名为type下fieldName字段对应的接口 一般在没有同名函数情况下,可使用1,2种方式注册,有些类型为非公有类型的,可通过3,5接口,通过类型名来注册有同名函数情况下,就需要使用3,4, 5方式进行注册,可参考HotHelloWorld.cs脚本 通过属性进行自动注册的,假如在类型中含有对应DelegateBridge静态字段的Hotfix变量,则会自动对此变量进行赋值,保存一些参数在实际使用补丁方式热更时,经常遇到一些,只是需要在原有函数之前或之后添加一些代码的情况,这时,你可以通过Hotfix来执行原先代码可参考HotHelloWorld.Start的使用建议使用第3种方式进行接口替换 建议:最好安装下.NET Reflector,可用来反编译被注入的dll,查看源文件,可加深理解XIL的实现原理。项目下文件Library/ScriptAssemblies/Assembly-CSharp.dll这u3d生成的dll文件,原理上,也是修改此文件实现热更新功能,可使用.NET Reflector进行反编译查看源码 热更下模拟MonoBehaviour组件,用法可以参考hotScripts下脚本,可以做到平时在非热更环境下开发调试,到要发版本时再转换为热更方式Unity5.6以下版本,编辑器下使用的Mono库,会报错,应该是Unity3D的Bug。可以使用源文件来替换dll,源文件在压缩包Mono.Cecil.zip下,可解压此文件,放到在Assets/XIL/Scripts/ILHotfix/Editor/下,并删除这三个Dll(Mono.Cecil.dll, Mono.Cecil.Mdb.dll,MonoCecil.Pdb.dll)

下载说明:请别用迅雷下载,失败请重下,重下不扣分!

发表评论

0 个回复

  • C# 采集器 源码下载
    采集器
    2016-07-27下载
    积分:1
  • 加密狗实现软件注册--示例源码下载.zip
    加密狗实现软件注册--示例源码下载.zip
    2019-08-08下载
    积分:1
  • C语言深度解剖
    C语言深度解剖
    2014-04-18下载
    积分:1
  • C# 三层架构示例项目源码(CodematicDemoF3)
    CodematicDemoF3  CodematicDemoF3 是一个基于工厂模式的三层架构示例项目源码,基于VS2005 SP1开发(如果没有装SP1,web项目会打不开),结构更简洁,提供更多有效的示例源码参考。方便用户更好的理解和使用该架构进行开发,配合动软Codematic代码生成器,可以使开发效率事半功倍,倍感轻松。 登录用户:admin  密码:1 ******************************************************项目结构:Lib:公用类库BLL: 业务层DALFactory: 工厂类IDAL: 接口层Model: 数据实体SQLServerDAL: 数据层Web: 表示层,Web项目 Codematic_Data.MDF : 该项目所使用的数据库DEncryptTest :加密解密工具 具体介绍请看 Codematic代码自动生成器 的帮助文档。
    2017-03-27下载
    积分:1
  • 多线程 Semaphore
    class Program    {        static void Main(string[] args)        {            Semaphore seamphore = new Semaphore(5, 5, "SemaphoreExample");             seamphore.WaitOne();            Console.WriteLine("Seamphore 1");            seamphore.WaitOne();            Console.WriteLine("Seamphore 2");            seamphore.WaitOne();            Console.WriteLine("Seamphore 3");
    2014-11-10下载
    积分:1
  • .NET Reflector 5.0 使用例子(反编译软件)
    .NET Reflector 5.0 Release Notes 28 December 2006 Reflector is a class browser for .NET components. It allows browsing and searching the meta data, IL instructions, resources and XML documentation stored in a .NET assembly. Reflector was first released in October 2000 running on .NET Framework 1.0 Beta. LINQ and .NET Framework 3.5: Reflector supports query expressions and other concepts introduced in C# 3.5. To enable this feature select ".NET 3.5" under View, Options, Disassembler, Optimization. .NET Framework compatibility: Reflector runs on all versions of the .NET Framework using its own assembly loading infrastructure which does not rely on the Reflection API. For example, Reflector can load .NET Framework 2.0 assemblies without having the .NET Framework 2.0 installed. Assembly Lists: When launched for the first time, Reflector allows you to choose a default set of assemblies. The list of assemblies is then stored in the Reflector.cfg file and will be loaded next time you open the program. Reflector allows creating multiple assembly lists and switching between the lists using the File, Open List dialog. To choose a different set of default assemblies for the current assembly list you should remove all assemblies from the list (DEL) and invoke the Refresh command (F5). Assembly Cache: When resolving an assembly reference, Reflector will first search the local path next to the assembly holding the reference and then falls back to the cache directories defined in the Reflector.cfg file. Reflector does not search the Global Assembly Cache (GAC) unless you add "%SystemRoot%Assembly" to the cache directories list. Assembly Versioning: By default, assembly version numbers are ignored when resolving type and member references. You can enable side-by-side versioning in the options dialog but it is suggested to avoid this if possible. Add-Ins: Information about the Reflector add-in model can be found here. The most recent version of .NET Reflector is available here. Disclaimer: This software is provided "AS IS" with no warranties of any kind. The entire risk arising out of the use or performance of the software is with you.
    2015-06-15下载
    积分:1
  • Unity导出gltf格式插件.unitypackage
    Unity导出gltf格式插件
    2021-05-06下载
    积分:1
  • 基于51单片机的硬币电子秤的实现
    这是基于51单片机的硬币电子秤的实现,内含C语言源码和proteus仿真实现 【源码目录】 硬币电子秤的实现 ├── 1Kg电子秤程序(LCD1602显示)│   ├── HX711.H│   ├── HX711.LST│   ├── HX711.OBJ│   ├── HX711.c│   ├── LCD1602.LST│   ├── LCD1602.OBJ│   ├── LCD1602.c│   ├── LCD1602.h│   ├── MAIN.H│   ├── lcd12864.LST│   ├── lcd12864.OBJ│   ├── lcd12864.c│   ├── lcd12864.h│   ├── main│   ├── main.LST│   ├── main.M51│   ├── main.OBJ│   ├── main.c│   ├── main.hex│   ├── main.lnp│   ├── main.plg│   ├── main.uvgui.Administrator│   ├── main.uvgui.Cai Chao│   ├── main.uvgui_Administrator.bak│   ├── main.uvgui_Cai Chao.bak│   ├── main.uvopt│   ├── main.uvproj│   ├── main_uvopt.bak│   ├── main_uvproj.bak│   ├── uart.LST│   ├── uart.OBJ│   ├── uart.c│   └── uart.h├── HX711模块加载文件│   └── HX711.hex├── Last Loaded 电子秤实现3.fv8.5.pdsbak├── Last Loaded 电子秤实现3.pdsbak├── 电子秤实现3.pdsprj├── 电子秤实现3.pdsprj.DESKTOP-SC10NBS.zxh.workspace└── 电子秤实现3.pdsprj.LAPTOP-KPK9NO8B.浪峰姐姐.workspace2 directories, 39 files【核心代码】void main(){    Uart_Init();    Send_Word("Weight"); Send_Word("Num"); Init_LCD1602(); LCD1602_write_com(0x80); LCD1602_write_word("Weight"); LCD1602_write_com(0x80 7); LCD1602_write_word("Num"); Delay_ms(1000); //ÑÓʱ,µÈ´ý´«¸ÐÆ÷Îȶ¨ Get_Maopi(); //³ÆÃ«Æ¤ÖØÁ¿ while(1) { EA = 0; Get_Weight(); //³ÆÖØ Number = Weight_Shiwu/(coin_weight*10); EA = 1; Scan_Key(); //ÏÔʾµ±Ç°ÖØÁ¿ if( Flag_ERROR == 1) {            Send_Word("ERROR"); LCD1602_write_com(0x80 0x40); LCD1602_write_word("ERROR "); } else {                     Send_ASCII(Weight_Shiwu/1000 0X30);            Send_ASCII(Weight_Shiwu%1000/100 0X30);            Send_ASCII(Weight_Shiwu%100/10 0X30); Send_Word(".");            Send_ASCII(Weight_Shiwu%10 0X30);            Send_Word("g"); LCD1602_write_com(0x80 0x40); LCD1602_write_data(Weight_Shiwu/1000 0X30);            LCD1602_write_data(Weight_Shiwu%1000/100 0X30);            LCD1602_write_data(Weight_Shiwu%100/10 0X30); LCD1602_write_word(".");            LCD1602_write_data(Weight_Shiwu%10 0X30); LCD1602_write_word("g"); Send_ASCII(Number/100 0x30); Send_ASCII(Number%100/10 0x30); Send_ASCII(Number%10 0x30); LCD1602_write_com(0x80 0x40 7); LCD1602_write_data(Number/100 0x30); LCD1602_write_data(Number%100/10 0x30); LCD1602_write_data(Number%10 0x30); Send_ASCII(coin/10 0x30); Send_ASCII(coin%10 0x30); Send_Word("jiao"); LCD1602_write_com(0x80 12); LCD1602_write_data(coin/10 0x30); LCD1602_write_data(coin%10 0x30); LCD1602_write_com(0x80 0x40 12); LCD1602_write_word("jiao"); } }}
    2021-05-06下载
    积分:1
  • wpf mvvm prism 2官方学习实例下载
    wpf mvvm学习
    2015-01-13下载
    积分:1
  • C# POP3接收邮件程序
    C# POP3接收邮件程序
    2015-02-04下载
    积分:1
  • 696516资源总数
  • 106914会员总数
  • 0今日下载