Unity dll 热更新 前奏

来源:互联网 发布:淘宝在哪里查看扣分 编辑:程序博客网 时间:2024/06/10 02:57
之前研究了一段lua 的热更新,说实在话,如果不是对lua有很强的能力的,要是去做lua会吐血的,特别是是在unity中做,而且ulua的实现方式也是并不能做到想怎么更久怎么更。
因为有wrap的东西在,如果你有新的文件需要wrap那么你的动态更新可以宣布没啥用了。

鉴于项目的时间,人力物力的限制,我准备考虑放弃lua了。毕竟我主张的是开发需要快乐的。不希望lua的print来进行调试,也不希望看到zbs等工具老是把我的unity搞挂掉。

目前可以做的就是使用dll来进行更新了,而外部dll更新的话又无法使用到ios上,因为ios无法进行反射。所以项目后续的话就只能先上android等待稳定了后,再上ios的决策。

由于没有做外部的dll的经验,这里提出几个自己决定有所疑问的地方。和自己大概的构建思路。

疑问点
1> 大部分的ui 都会绑定一个mono,而这个mono大部分人都会静态的关联一些ui空间,以及一些初始化的参数。那么如果我们进行dll这些mono的代码,需要怎么来管理好这些控件的初始化,以及参数的初始化

2>mono 代码里面调用了非mono的代码是否需要反射去获取。比如protobuf的cs文件,比如数据文件

3>如何在开发过程中让开发的同学不需要关心这些问题,而只是在打包android的时候把以上问题解决了。


针对以上的问题我的大概思路是这个样子的

首先需要一个管理外部dll的程序集的脚本,姑且叫它 AssemblyMgr 这个里面应该要提供如下的功能

1> 如果是android平台那么加载制定程序集‘,并保存程序集的引用

2> 提供一个获取脚本的接口
    AddCompetent(gameobject prefab,  string 脚本名字){
         if(anroid)
           prefab.addCompotent 程序集中获取指定名字的脚本
           初始化导出的数据文件 ()
        else
        return  prefab.getCompotent<>();
    }


UI 管理器 简称 UIManager 当调用方法进行显示窗口的时候

大概有这样的 Show(wndId){
      prefab = loadWnd(assetbundle)
      AssemblyMgr.addCompotent(prefab, preab_cs);

}

3>具体的窗口代码,数据层代码 通过dll打包称assetbundle进行更新

窗口的控件获取需要使用find等方法
窗口上其他的数据需要有个初始化接口 因此大概的结构如下图
class Mono:MonoBahaviour{
   void Awake(){
       初始化控件
       初始化脚本
   }
   void InitCompotent()
   {

   }
   void InitData(){

   }

}




目前的想法大概如上,后面等实现













0 0