使用版本
ET版本用的4.0分支带FairyGUI组件
ILRuntime:合并的master分支上的新版本
Unity版本2017.4.15f1
新版本注意事项
- 更新ILRuntime后,Assembly的stream不能关闭,所以要改掉using的用法
//旧代码
using (MemoryStream fs = new MemoryStream(assBytes))
using (MemoryStream p = new MemoryStream(mdbBytes))
{
this.appDomain.LoadAssembly(fs, p, new Mono.Cecil.Pdb.PdbReaderProvider());
}
//新代码
this.dllStream = new MemoryStream(assBytes);
this.pdbStream = new MemoryStream(pdbBytes);
this.appDomain.LoadAssembly(this.dllStream, this.pdbStream, new Mono.Cecil.Pdb.PdbReaderProvider());
- 更新ILRuntime后,Enum的等值对比有问题,把ConfigAttribute中的枚举类型改成int类型,配置文件的Attribute也要做相应修改
//旧代码
[Config(AppType.ClientH | AppType.ClientM)]
public class ExperiencerConfigCategory : ACategory<ExperiencerConfig>
{
}
//新代码
[Config((int)(AppType.ClientH | AppType.ClientM))]
public class ExperiencerConfigCategory : ACategory<ExperiencerConfig>
{
}
IOS真机注意事项
下面的问题都是iltocpp后在IOS真机出现的,一般表现为nullchek崩溃,而pc版(开了ILRuntime)正常。
- 传delegate回调给主工程Model.dll时,不要使用带额外参数的嵌套lambda表达式。
比如在Model.dll里面定义了一个参数为JsonData的回调SendRequest,在Hotfix.dll里面直接传callback函数进去没有问题:
ETModel.HttpModule.Instance.SendRequest(
proto.GetUrlHead(),
proto.GetProtocolStr(),
proto.GetRequestType(),
ReadMainCallback
);
private void ReadMainCallback(JsonData data) { }
但是如果想加参数,写成类似下面这种:
ETModel.HttpModule.Instance.SendRequest(
proto.GetUrlHead(),
proto.GetProtocolStr(),
proto.GetRequestType(),
(data) =>
{
ReadMainCallback(data, otherparams);
// bla bla bla
}
);
private void ReadMainCallback(JsonData data, otherparams...etc) { }
则回调中如果出现New或者Activator.CreateInstance Hotfix.dll内部的类时,真机会报nullchek崩溃
ET框架内部各个模块之间大部分情况下是通过Event事件来通信,不过在Hotfix.dll里面要注意尽量不要嵌套Hotfix层的事件。比如事件A触发函数里面又触发了事件B,则在事件B的触发函数里面,在GetComponent取组件的时候,有一定几率在真机上报nullchek崩溃。
不要在Hotfix.dll的类里面加两个或者两个以上的Attribute,我想在ConfigCatogery的定义里面加一个额外的Attribute,结果真机上Activator.CreateInstance创建这个类的时候会报nullchek崩溃,类似这样:
[Config((int)(AppType.ClientH | AppType.ClientM))]
[ABConfig(ABConfigName.Exp)]
public class ExperiencerConfigCategory : ACategory<ExperiencerConfig>
{
}
我想给某个配置文件单独定义在一个AB里面(都放在config.unity3d里面说实话加载不是很灵活),一开始想法是再加一个Attribute定义ab的名字,在Model.dll下没问题,但是IOS真机上就会崩溃。
不要定义Model.dll和Hotfix.dll都监听的事件。
如果一个事件A在热更层和主工程都监听了,那在IOS真机上,触发完一层的函数到另外一层时,很可能会报nullchek崩溃。在热更Hotfix.dll中,Component如果注册了Update(可能还包含Awake等其他的,没有测试)函数,则在Update中不要触发Hotfix层的事件,和第一点类似,在运行到new或者Activator.CreateInstance会报nullchek崩溃,无法创建Hotfix内部的类。
不要使在热更层用System.Linq。
有时候为了方便处理集合,用了一些Linq里的方法,比如First()之类的,但是在ios上iltocpp之后会抛出一些pc版或者android没有的异常。
其他的一些还没遇到的坑会不定时更新。