记录一下使用 ilruntime和StripEngineCode导致一些功能不生效的问题

前言

使用ilruntime热更新框架做2D游戏,在编辑器里可以正常运行,但在真机上却无法检测到CapsuleCollider2D的碰撞。

填坑

本来不太明白原因,对比了项目里生成的bind文件。发现bind的CircleCollider2D碰撞是生效的。

记录一下使用 ilruntime和StripEngineCode导致一些功能不生效的问题绿色标记的原有的,红色的是我新增的。
问题得到解决。CapsuleCollider2D的碰撞开始生效了。

扩展

根据其他大佬对clr绑定的描述,clr绑定有两个作用:
防止热更层用到的框架层代码被裁减, 以及 加速热更代码的执行。为什么会被裁减呢?因为Unity打包的时候真的不把这个热更dll看做dll,因为这个热更dll是脱离unity框架层的。自然在unity打包的时候,为了包体大小会把认为没有使用的代码全部过滤掉。这种情况下ILRuntime解释执行的时候,去反射调用框架层代码就会被视为错误,因为框架层不存在这些被调用的代码。 加速热更代码执行其实是ILRuntime解释每条il指令的时候,都会去现有缓存中查找当前指令是否为重定向函数,如果为重定向函数,则直接调用,如果不是重定向函数,则会反射调用,反射这就是效率的隐患。重定向函数有自己的函数签名格式,类似lua的LuaCsFunction。

没有生效的原因应该就是没有bind被裁减了原因,那么为什么我之前bind没有红色标识对应的bind文件呢?
我搜索了整个热更工程,发现代码中并没有出现CapsuleCollider2D。而使用的唯一位置是预制体上有这个组件,所以根据热更工程生成的dll文件生成的bind文件里并没有CapsuleCollider2D这个组件对应的bind文件。
那应该怎么解决呢?

解决方案

首先可以通过在热更里引用CapsuleCollider2D对应类文件,比如new一个组件达到使用的目的。然后重新生成bind文件。即可解决问题。

扩展解决方案2

如果是因为没有bind导致被裁剪产生的bug,那么为什么会被裁剪呢,到底是什么东西产生的这个操作呢?
稍一探究,发现了这个东西
记录一下使用 ilruntime和StripEngineCode导致一些功能不生效的问题其实是一个优化代码使包体变得更小的一个功能。
所以如果我们不在乎包体大小,是不是可以取消这个功能使我们的代码不被裁剪呢?
没错,取消勾选也可以解决问题。

扩展解决方案3

那么问题来了,我又想减小包体又想修复Bug怎么办?
这里扩展一个strip engine code简单的用法。
可以在Assets/下添加link.xml文件来手动排除不被剖离的类。
记录一下使用 ilruntime和StripEngineCode导致一些功能不生效的问题
这样可以防止我们用到的类被裁减。

那么我们怎么获取我们需要的类呢?全凭感觉和bug信息,比如我们添加的第三方组件和sdk等等最好就添加一下。
其他个别被忽略的类可能会产生类似这样的Bug输出

记录一下使用 ilruntime和StripEngineCode导致一些功能不生效的问题
我们可以通过这个ID在末尾地址查找到自己被裁剪的类。 查询地址

以上。