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 Alloc方式来调用
成员方法
三板斧调用(和静态方法调用 ...
UH4L4——调用ILRuntime中类对象属性
UH4L4——调用ILRuntime中类对象属性
本章代码关键字
12345678IType.GetMethod() //获取热更对象的方法信息appDomain.Invoke() //传入要执行方法的对象,要执行的方法信息,要传入的参数,执行热更工程里的方法(属性),如果有返回值则可以接收appDomain.BeginInvoke() //该方法配合using执行方法,需要传入方法信息,可以避免GC Alloc,性能更好InvocationContext //appDomain.BeginInvoke方法返回的对象,通过它即可执行方法InvocationContext.PushObject() //要执行方法的对象InvocationContext.PushValueType<>() //传入参数InvocationContext.Invoke() //执行方法InvocationCont ...
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类型后, 强转为ILType后调用Instantiate方法
appD ...
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 static i ...
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> realTimerDic ...
UFL10-2——TimeManager 具体实现
UFL10-2——TimeManager 具体实现
TimeManager 具体实现
1234public class TimerManager : BaseManager<TimerManager>{ private TimerManager() { }}
需要声明的关键成员
计时器字典容器
1234/// <summary>/// 用于管理所有计时器的字典容器/// </summary>private Dictionary<int, TimerItem> timerDic = new Dictionary<int, TimerItem>();
待移除计时器列表容器
1234/// <summary>/// 待移除的列表/// </summary>private List<TimerItem> delList = new List<TimerItem>();
等等
需要实现的关键方法
开启计时器管理器(实 ...