ILRuntime学习记录

 项目Github地址
https://github.com/Ourpalm/ILRuntime
Unity示例工程Github地址
https://github.com/Ourpalm/ILRuntimeU3D/
在线文档
https://ourpalm.github.io/ILRuntime/

    最近按照主程要求,学习了ILRuntime这个u3d的热更,首先当然是找到QQ群组织:512079820。只要把问题发出来,总有好心的人回答你。然后按照群里面的公告,去下载Demo工程,然后看基础教程。

    ILRuntime热更:把需要热更的代码(全部热更也可以)写在另外一个c#工程,然后把这个工程打包成dll,点击VS菜单栏的"生成->生成解决方案"就可以了。然后u3d那边就是读取这个dll调用里面的方法,这一步我感觉有点像是u3d调用Android或者Ios的方法那样,都是填写类型、方法名、参数,这样就能调用到,当然这是简单的调用。具体的可以下载Demo工程看下。

    学习中遇到的问题:

根据教程从零开始遇到的第一个问题,“HotFix_Project是热更DLL工程,请用VS2015之类的C# IDE打开和进行编译,在编译前请确保至少打开过一次Unity的主工程,如果编译依然说找不到UnityEngine等dll,请手动重新指认一下”。我的热更DLL工程生成解决方案报错,找不到引用的UnityEngine的dll,所以需要重新指定。找到HotFix_Project工程文件夹下面,找到HotFix_Project.csproj打开编辑。

ILRuntime学习记录

第一第二个红框就是生成之后热更dll的目录,后面的红框就是引用的dll,换成自己unity所在的dll目录就可以。改了之后就发现可以编译成功了。

第二个问题就是使用委托的问题。在热更里面,如果要把热更定义的委托给U3D那边使用,是需要在U3D那边先注册的,什么原因可以看下委托那边的教程,例如我在热更里面用了List.Sort(A)这个排序方法,A是我自己写的排序方法,这个时候其实是调用了U3D那边的,我A方法这个是个委托来的,需要在U3D那边注册,这里我一直弄不懂怎么注册,因为在教程里面只写了float,int,bool这些基础类型的注册,如果我委托的参数是自己定义的类,应该怎么注册呢?后面还是在QQ群里面寻找到了帮助,如果委托参数是继承MonoBehaviour的,例如我热更里面用到的排序方法

public int SortList(UI_BagItem p, UI_BagItem q)
        {
            return q.quality.CompareTo(p.quality);
        }

UI_BagItem是继承MonoBehaviour的,所以需要在U3D工程那边这样注册:

appdomain.DelegateManager.RegisterFunctionDelegate<MonoBehaviourAdapter.Adaptor, MonoBehaviourAdapter.Adaptor, System.Int32>();// 最后一个类型是返回类型,具体可以先看下委托那个教程。

appdomain.DelegateManager.RegisterDelegateConvertor<System.Comparison<MonoBehaviourAdapter.Adaptor>>((act) =>
        {
            return new System.Comparison<MonoBehaviourAdapter.Adaptor>((x, y) =>
            {
                return ((System.Func<MonoBehaviourAdapter.Adaptor, MonoBehaviourAdapter.Adaptor, System.Int32>)act)(x, y);
            });
        });

这些我都是在Demo工程上进行的。MonoBehaviourAdapter.Adaptor这个类型也是作者写好的。加上这两句后,就算注册成功了。

如果这个参数不是MonoBehaviour而是自己定义的类应该如果注册呢,例如我在热更里面的排序方法是这样:

public int SortList2(TestSort p, TestSort q) {
            return p.t1.CompareTo(q.t2);
        }

TestSort是自己定义的类,什么都没继承的,这个时候把MonoBehaviourAdapter.Adaptor 换成ILTypeInstance就可以了。

目前就是学习遇到的问题,现在这里记录下,以后遇到问题还会继续加。