跳到主要内容

热重载技术

热重载技术用于完全卸载或者重新加载一个assembly,适用于小游戏合集类型的游戏。该方案只提供商业化版本

支持的特性

  • 支持卸载assembly,卸载100%的assembly所占用的内存
  • 支持重新加载assembly,代码可以任意变化甚至完全不同(MonoBehaviour和Scriptable有一定的限制)

待实现,暂未支持的特性

  • 支持限定热更新assembly中能访问的函数的集合,适合UGC游戏中创建沙盒环境,避免恶意玩家代码造成破坏。

不支持特性及特殊要求

  • 要求业务代码不会再使用被卸载的Assembly中的对象或者函数,并且退出所有在执行的旧逻辑
  • 要求重载的MonoBehaviour中的事件或消息函数如Awake、OnEable之类不发生增删(但函数体可以变化)
  • 要求重载后在旧Assembly中存在同名类的MonoBehaviour类的序列化字段名不发生变化(类型可以变)
  • 不能直接卸载被依赖的Assembly,必须按照逆依赖顺序先卸载依赖者,再卸载被依赖者。例如A.dll依赖B.dll,则需要先卸载A.dll,再卸载B.dll
  • 由于Unity自身实现的原因,与2022的Jobs不兼容,需要自行小幅修改UnityEngine.CoreModule.dll的代码。 2020-2021仍然可以正常工作
  • 不支持析构函数,~XXX()。也不允许实例化泛型参数带本程序集类型的带析构函数的泛型类