MonoBehaviour工作流

代码中通过 AddComponent<T>() 或者 AddComponent(Type) 动态挂在的Mono是完美支持的,但是,如果一个Mono脚本被挂在到了Prefab上,并且你想要热更这个脚本,那么就需要一些额外的操作

原理

Unity资源管理,在反序列化资源中的脚本时,要求满足如下条件

  1. 必须使用的是AssetBundle打包的资源
  2. 脚本所属DLL必须存在于打包生成的ScriptionAssembiles.json中
  3. 脚本所依赖的所有DLL已经加载到AppDomain中

如果打包时不做额外操作,那么热更新的DLL肯定是不会出现在json中滴,因此huatuo在脚本中处理了OnPostprocessBuild事件,总的来说就是把需要的DLL放到json中

具体类是BuildProcessor_xxx,把项目中挂在资源上且需要热更的类,所属的DLL名称加入s_monoHotUpdateDllNames中即可

public static List<string> s_monoHotUpdateDllNames = new List<string>()  
{  
    "HotFix.dll",  
};

然后注意,运行时需要提前把脚本依赖到的程序集都加载

#if !UNITY_EDITOR
	// 只有打包后才需要加载 HotFix.dll
	AssetBundle dllAB = BetterStreamingAssets.LoadAssetBundle("huatuo");
	TextAsset dllBytes = dllAB.LoadAsset<TextAsset>("HotFix.bytes");
#endif

AOT泛型问题

暂时无法理解,留下链接AOT泛型限制及原理介绍 | Focus Creative Games (focus-creative-games.github.io)