UH4L11——热更新工程使用MonoBehaviour
UH4L11——热更新工程使用MonoBehaviour
热更新工程使用MonoBehaviour
ILRuntime中虽然支持跨域继承MonoBehaviour,但是作者并不建议大家这样做
我们可以通过类似Lua热更中那样,在主工程中实现用于派发生命周期函数的的公共脚本
通过委托或事件达到生命周期函数的调用
ILRuntime不推荐直接使用MonoBehaviour
ILRuntime中支持在热更工程中跨域继承MonoBehaviour
注册跨域继承适配器
对泛型方法AddComponent进行重定向(较为复杂)
但是,ILRuntime并不推荐通过跨域继承直接使用MonoBehaviour
推荐大家类似Lua中一样使用MonoBehaviour
在主工程中通过委托或事件的形式派发生命周期函数 到 热更中
主要原因:
MonoBehaviour是一个很特殊的类,很多底层逻辑是在C++中处理的
比如其中public字段的序列化,在Inspector窗口中显示的功能,
如果在热更工程中去写,底层C++逻辑无法获取到热更工程中C#相关的信息
派发生命周期函数的形式使用M ...
UH4L10——值类型绑定
UH4L10——值类型绑定
本章代码关键字
1appDomain.RegisterValueTypeBinder() //注册值类型与值类型绑定类的绑定,可以提高值类型计算效率
值类型绑定
通过上节课我们知道,CLR绑定其实就是把ILRuntime中用到的Unity相关方法
进行CLR重定向,让本来要使用反射去执行的一些逻辑变成直接执行,这样可以大大提升我们的性能
那么值类型绑定,其实就是把Unity当中的一些常用值类型方法进行CLR绑定,比如Vector2、Vector3、Quaternion等
值类型绑定后,性能将得到大幅提升
值类型绑定,就是把Unity当中的一些常用值类型方法进行CLR绑定,它可以大幅提高在热更新工程中使用Unity中值类型对象的效率
如何进行值类型绑定
手写值类型绑定类(示例工程中提供了Vector2、Vector3、Quaternion的,可以直接使用)
注意:手写值类型绑定类必须了解ILRuntime原理,详见:UH4L18——基本原理,UH4L21——重定向的书写规则
注册值类型绑定
appDomain.Regi ...
UH4L9——CLR重定向和CLR绑定
UH4L9——CLR重定向和CLR绑定
CLR是什么
关于CLR是什么,详见:CLR —— 让应用程序在操作系统上运行
CLR(Common Language Runtime)公共语言运行时,它是.Net Framework的基础,
所有的.Net技术都是建立在此之上的,它帮助我们实现了跨语言和跨平台
它是一个在执行时管理代码的代码,提供内存管理、线程管理等等核心服务,
就好像一个小型的操作系统一样,所以形象的把它称为“.Net虚拟机”。
如果想要应用程序在目标操作系统上能够运行,就必须依靠.Net提供的CLR环境来支持
本章代码关键字
1appDomain.RegisterCLRMethodRedirection() //对反射出来的方法消息进行重定向,重定向到另外一个方法上,使得反射调用变为直接调用
CLR重定向和CLR绑定
CLR重定向主要是用于对热更工程中的一些方法进行"挟持",就是将原本的方法"挟持"了,重新实现方法里面的逻辑,达到 重定向的目的
说人话:我们可以通过CLR重定向,将某一个方法的执行定位到我们的 ...
UH4L8——跨域继承Unity中的类
UH4L8——跨域继承Unity中的类
本章代码关键字
1appDomain.RegisterCrossBindingAdaptor() //注册一个生成出来的适配器类,传入适配器对象
代码生成模板:
123456//ILRuntimeCrossBinding.GenerateCrossbindAdapter方法内using (System.IO.StreamWriter sw = new System.IO.StreamWriter("脚本生成路径和文件名")){ sw.WriteLine(ILRuntime.Runtime.Enviorment.CrossBindingCodeGenerator.GenerateCrossBindingAdapterCode(typeof(要跨域继承的类), "生成的类的命名空间"));}
跨域继承
ILRuntime支持在热更工程中继承Unity主工程中的类,这就是跨域继承
由于适配器在一些更为复杂的基类时,可能需要我们按照模板来手写一些内容
相对来说较为麻烦,如果没 ...
UH4L7——委托调用
UH4L7——委托调用
本章代码关键字
123appDomain.DelegateManager.RegisterFunctionDelegate<>() //注册一种有参数的Action<>委托,以便于IL2CPP打包裁剪后还可以调用appDomain.DelegateManager.RegisterMethodDelegate<>() //注册一种Func<>委托,以便于IL2CPP打包裁剪后还可以调用appDomain.DelegateManager.RegisterDelegateConvertor<>() //将自定义委托转换为等效的Action<>委托或者Func<>委托,这样才能跨域调用自定义委托
委托调用
在委托的跨域调用中,如果出现Unity中自定义委托跨域关联ILRuntime中函数,需要进行:
注册委托(主要目的,避免IL2CPP打包裁剪报错)
注册委托转换器(主要目的,ILRuntime内部所有的委托都是以Action或Func来存 ...
UFL12-4——大数据数值转字符串方法
UFL12-4——大数据数值转字符串方法
大数据数值转字符串 的方法
我们在游戏开发时,为了避免在界面中显示过长的数值,往往需要把过长数值进行转换
比如:1198678978 转换为 11亿9千万、5328987 转换为 532万8千
因为如果直接在界面上显示过长的数值可能会影响UI布局,而过大的数也可以直接粗略显示可以直接省略后面的内容,显示一个大概数值
因此我们可以将其封装为一个常用方法
需求:以 亿 和 万 作为转换临界点,超过亿,则显示为 n亿n千万,超过万,则显示为 n万n千 这种形式
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647/// <summary>/// 把大数值转换为精简了位数的字符串,大于一亿的转换为n亿n千万,大于一万的转换为n万n千/// </summary>/// <param name="num">要转换的数值</param>/// <return ...
UFL12-3——秒转时间字符串相关
UFL12-3——秒转时间字符串相关
秒转时分秒 的方法
我们在游戏开发中界面显示时,经常可能会有这样的需求,要在界面中显示 n时n分n秒 的倒计时,
而一般都是根据倒计时剩余秒数进行转换的,因此我们可以将其封装为一个常用方法
需求:
函数有两个参数:秒数 和 是否忽略0(若为 0时0分53秒 前面的0应该不拼接 直接显示53秒)
可以传入用于拼接的 时分秒 字符
当忽略0时,如果存在时,分和秒也必须显示;如果存在分,秒也必须显示(避免出现 1时53秒、1时5分 这种显示)
由于常常会拼接字符串,为了节约性能,我们在这里可以使用StringBuilder,返回时再转为字符串传递出去
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253private static StringBuilder resultStr = new StringBuilder("");/// <summary>/// 将秒数转换为时分 ...
UFL12-2——数字转字符串相关
UFL12-2——数字转字符串相关
转字符串数字前补0 的方法
我们在游戏开发中界面显示时,经常可能会有这样的需求,要在界面中显示:
123000101010
举例:
也就是说想要让某个数字在转换为字符串时,可以指定转换的字符串长度,并且能够在数字前自动的添加0
123456789101112/// <summary>/// 将数值转换为字符串,可以指定长度,长度不足时自动在前面补充0/// </summary>/// <param name="value">要转换的数值</param>/// <param name="len">最短长度,传入的数值长度不足时会补充0</param>/// <returns>转换出来的字符串</returns>public static string GetNumStr(int value, int len){ //int.ToString如果传入一个"Dn"(n是数值)的字符串, ...
UFL12-1——字符串拆分方法
UFL12-1——字符串拆分方法
前置知识点:string 中 Split 相关知识点(C#四部曲中)
实现文本工具类中的 字符串拆分方法
我们在配置表中,经常会配置如下格式的字符串数据,例如:
1,10;2,4;32,1
2,11|3,12|4,55
遇到这种数据时,我们往往会使用string中的Split方法进行拆分
我们想要通过封装满足以下的需求
避免符号填写错误,英文字符填写成中文字符
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556/// <summary>/// 拆分字符串,返回字符串数组/// </summary>/// <param name="str">想要被拆分的字符串</param>/// <param name="type">拆分字符类型:1-; 2-, 3-% 4-: 5-空格 ...
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> /// 把逻辑处理权交给热更新工程,这是一个启动 ...