UH4L6——ILRuntime调用Unity
UH4L6——ILRuntime调用Unity ILRuntime调用Unity ILRuntime跨域调用Unity中相关内容,相对更简单,和Unity开发中一样使用即可 需要注意的是,使用中如果无法正常使用Unity相关组件,都是因为热更工程没有引用对应的Unity相关模块的DLL文件 我们只需要找到对应DLL文件 复制到 热更工程中的UnityDlls文件夹中,并且在热更工程中引用 即可 在ILRuntime工程中做一个主入口 我们在做有热更新功能的项目时,往往会有大量的逻辑是在热更工程中完成的 所以我们会在热更工程中做一个主入口,相当于是把逻辑处理权交给热更工程的感觉 类似在Lua热更相关知识点中讲解的相关内容 ILRuntime热更新工程内 123456789101112131415using UnityEngine;namespace HotFix_Project{ internal class ILRuntimeMain { /// <summary> ///...
UH4L5——调用ILRuntime中方法
UH4L5——调用ILRuntime中方法 本章代码关键字 12appDomain.Invoke() //除了传入IMethod,对于方法直接传入类名,方法名,要执行方法的对象(静态方法不传入),参数,即可执行方法IType.GetMethod() //除了传入参数数量,还可以传入List<IList>来指定获取哪种参数列表的重载方法 跨域调用方法 静态方法 静态方法调用的规则和成员属性方法调用规则基本类似,三板斧调用: appdomain.Invoke("命名空间.类名", "静态方法名", null, 参数列表) appdomain.Invoke(IMethod对象, null, 参数列表) 无GC Alloc方式:using(BeginInvoke){ push Invoke read -> ubpir }方式 注意:建议大家都使用类似反射的IMethod来调用方法,并且使用更节约性能的无GC...
UH4L4——调用ILRuntime中类对象属性
UH4L4——调用ILRuntime中类对象属性 本章代码关键字 12345678IType.GetMethod() //获取热更对象的方法信息appDomain.Invoke() //传入要执行方法的对象,要执行的方法信息,要传入的参数,执行热更工程里的方法(属性),如果有返回值则可以接收appDomain.BeginInvoke() //该方法配合using执行方法,需要传入方法信息,可以避免GC Alloc,性能更好InvocationContext //appDomain.BeginInvoke方法返回的对象,通过它即可执行方法InvocationContext.PushObject() //要执行方法的对象InvocationContext.PushValueType<>() //传入参数InvocationContext.Invoke() ...
UH4L3——实例化ILRuntime中对象
UH4L3——实例化ILRuntime中对象 本章代码关键字 12345appDomain.Instantiate() //通过appDomain去实例化热更工程内的一个对象IType //ILRuntime封装的类型相关的接口appDomain.LoadedTypes[] //通过"命名空间.类名"获取一个IType对象,提供它可以获取对象ILType.Instantiate() //将IType强转为ILType后可以获取该方法实例化对象IType.ReflectionType //获取热更新工程内的Type消息,之后可以基于这个Type反射构造函数再实例化方法 在ILRuntime热更工程中新建一个类 Unity中实例化ILRuntime中类对象主要有三种方式 appDomain中的Instantiate方法 appDomain中LoadedTypes字典获取IType类型后,...
UH4L2——Unity中启动ILRuntime
UH4L2——Unity中启动ILRuntime 本章代码关键字 12345AppDomain //用于解释执行dll和pdb文件的类appDomain.LoadAssembly() //传入dll和pdb的流,读取热更内容PdbReaderProvider //读取Pdb相关内容,使用appDomain.LoadAssembly()读取pdb时需要实例化该类并传入appDomain.UnityMainThreadID //向AppDomain设置Unity的主线程的线程ID,以便于让ILRuntime相关可以在Unity的Profiler窗口内查看Thread.CurrentThread.ManagedThreadId //当前托管线程的主线程 ILRuntime关键类AppDomain ILRuntime 的开发方式,是在 Unity 主工程和 ILRuntime...
UH4L1——环境搭建和开发方式
UH4L1——环境搭建和开发方式 ILRuntime环境搭建 想要正常使用ILRuntime的注意事项: 修改manifest.json文件中的配置 Allow ‘unsafe’ Code 选项 通过HotFix_Project工程生成用于热更的dll和pdb文件 ILRuntime的基本原理就是利用Mono.Cecil库,去解释执行热更工程中DLL中的代码 环境搭建具体步骤 修改工程文件夹下Packages文件夹中的manifest.json文件,在 dependencies 字段前加上: 123456789"scopedRegistries": [ { "name": "ILRuntime", "url": "https://registry.npmjs.org", "scopes": [ "com.ourpalm" ] ...
UFL13——数学计算工具模块
UFL13——数学计算工具模块 前置知识点 Unity中向量、四元数 相关知识点(Unity四部曲之Unity基础中) 射线检测 相关知识点(Unity四部曲之Unity基础中) 范围检测 相关知识点 (Unity四部曲之Unity基础中) 数学计算工具模块 主要作用 在游戏开发中,经常会进行一些通用的数学计算,为了减少代码冗余 我们往往会把常用的数学计算逻辑,封装到一个工具类中提供给外部使用 因此数学计算工具模块,主要就是将通用的数学计算逻辑封装为方法,供外部使用 数学计算工具模块 基本原理 我们将新建一个数学计算工具类,主要提供以下方法: 角度和弧度的转换 得到两个对象在xz平面上的距离 判断对象是否在屏幕范围外 判断对象位置是否在xz平面扇形范围内 射线检测 范围检测 等等 我们只实现以上方法,更多内容,在实际开发时根据需求加入到工具类中即可 角度和弧度相互转换 的方法 虽然Unity中的 Mathf 类中已经有 Mathf.Deg2Rad 、 Mathf.Rad2Deg...
UFL12——文本工具模块
UFL12——文本工具模块 文本工具模块 主要作用 在游戏开发中,经常会对字符串进行一些处理。而这些处理往往会在多处使用 为了减少代码冗余,我们往往会把常用的文本操作逻辑,封装到一个工具类中提供给外部使用 因此文本工具模块,主要就是提取通用的文本处理逻辑封装为方法供外部使用 文本工具模块 基本原理 我们将新建一个文本工具类,主要提供以下方法: 字符串拆分公共方法,字符串数组,拆分为int数组 数字前补0转字符串 秒转时分秒 秒转00:00:00 大数据数值转换 等等 我们只实现以上方法,更多内容,在实际开发时根据需求加入到工具类中即可 具体实现 字符串拆分方法 数字转字符串相关 秒转时间字符串相关 时分秒 00:00:00 大数据数值转字符串方法
UFL11——加密工具模块
UFL11——加密工具模块 前置知识点:数据加密、异或加密 相关知识点(数据持久化之2进制中) 加密工具模块 主要作用 在游戏开发中,为了防止玩家利用修改器等工具修改游戏数据,我们往往会加入数据加密功能 主要作用就是提高游戏安全性,防止被修改,而加密工具模块就是为了方便数据加密而存在的 加密工具模块的主要作用,就是将存储在内存中的数据进行加密,避免玩家利用修改器查找内存中数据进行修改 加密工具模块 基本原理 加密:将原本存储在内存中的值进行加密后变换为另一个值存储在内存中 解密:将内存中存储的值进行解密后得到原始值 加密算法:异或加密 我们将新建一个加密工具类,主要提供以下方法: 获取随机密钥 方法 加密数据 方法 解密数据 方法 只要在需要加密的地方进行相关方法调用即可 加密工具模块 具体实现 获取随机密钥 方法 如何获取随机密钥是可以自定义的 12345678/// <summary>/// 获取随机密钥/// </summary>/// <returns>生成的密钥</returns>public...
TimeManager 进阶优化
TimeManager 进阶优化 问题回顾 目前的计时器管理器会受到 Time.timeScale 的影响,我们应该如何让计时器管理器可以自己决定是否受到它的影响呢? 必备知识点 Unity中 在协同程序中使用 yield return new WaitForSeconds() 会受到Time.timeScale影响 但是Unity也提供了不受其影响的 yield return new WaitForSecondsRealtime() 我们将利用它制作不受timeScale影响的计时器 计时器模块 进阶优化 主要制作思路: 在计时器模块中,保留之前的受 Time.timeScale 影响的计时器 并添加一种不受其影响的计时器,让开发者可以根据需求选择使用 主要修改处: 添加一个字典容器专门记录不受其影响的计时器 1234/// <summary>/// 用于管理所有不受Time.timeScale影响的字典容器/// </summary>private Dictionary<int, TimerItem>...