之前研究了一段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(){
}
}
目前的想法大概如上,后面等实现