使用版本
ET版本用的4.0分支帶FairyGUI組件
ILRuntime:合并的master分支上的新版本
Unity版本2017.4.15f1
新版本注意事項(xiàng)
- 更新ILRuntime后呻畸,Assembly的stream不能關(guān)閉初澎,所以要改掉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的等值對(duì)比有問題,把ConfigAttribute中的枚舉類型改成int類型宛瞄,配置文件的Attribute也要做相應(yīng)修改
//舊代碼
[Config(AppType.ClientH | AppType.ClientM)]
public class ExperiencerConfigCategory : ACategory<ExperiencerConfig>
{
}
//新代碼
[Config((int)(AppType.ClientH | AppType.ClientM))]
public class ExperiencerConfigCategory : ACategory<ExperiencerConfig>
{
}
IOS真機(jī)注意事項(xiàng)
下面的問題都是iltocpp后在IOS真機(jī)出現(xiàn)的,一般表現(xiàn)為nullchek崩潰,而pc版(開了ILRuntime)正常苛坚。
- 傳delegate回調(diào)給主工程Model.dll時(shí),不要使用帶額外參數(shù)的嵌套lambda表達(dá)式色难。
比如在Model.dll里面定義了一個(gè)參數(shù)為JsonData的回調(diào)SendRequest泼舱,在Hotfix.dll里面直接傳callback函數(shù)進(jìn)去沒有問題:
ETModel.HttpModule.Instance.SendRequest(
proto.GetUrlHead(),
proto.GetProtocolStr(),
proto.GetRequestType(),
ReadMainCallback
);
private void ReadMainCallback(JsonData data) { }
但是如果想加參數(shù),寫成類似下面這種:
ETModel.HttpModule.Instance.SendRequest(
proto.GetUrlHead(),
proto.GetProtocolStr(),
proto.GetRequestType(),
(data) =>
{
ReadMainCallback(data, otherparams);
// bla bla bla
}
);
private void ReadMainCallback(JsonData data, otherparams...etc) { }
則回調(diào)中如果出現(xiàn)New或者Activator.CreateInstance Hotfix.dll內(nèi)部的類時(shí)枷莉,真機(jī)會(huì)報(bào)nullchek崩潰
ET框架內(nèi)部各個(gè)模塊之間大部分情況下是通過Event事件來通信娇昙,不過在Hotfix.dll里面要注意盡量不要嵌套Hotfix層的事件。比如事件A觸發(fā)函數(shù)里面又觸發(fā)了事件B笤妙,則在事件B的觸發(fā)函數(shù)里面冒掌,在GetComponent取組件的時(shí)候,有一定幾率在真機(jī)上報(bào)nullchek崩潰蹲盘。
不要在Hotfix.dll的類里面加兩個(gè)或者兩個(gè)以上的Attribute股毫,我想在ConfigCatogery的定義里面加一個(gè)額外的Attribute,結(jié)果真機(jī)上Activator.CreateInstance創(chuàng)建這個(gè)類的時(shí)候會(huì)報(bào)nullchek崩潰辜限,類似這樣:
[Config((int)(AppType.ClientH | AppType.ClientM))]
[ABConfig(ABConfigName.Exp)]
public class ExperiencerConfigCategory : ACategory<ExperiencerConfig>
{
}
我想給某個(gè)配置文件單獨(dú)定義在一個(gè)AB里面(都放在config.unity3d里面說實(shí)話加載不是很靈活)皇拣,一開始想法是再加一個(gè)Attribute定義ab的名字,在Model.dll下沒問題薄嫡,但是IOS真機(jī)上就會(huì)崩潰氧急。
不要定義Model.dll和Hotfix.dll都監(jiān)聽的事件。
如果一個(gè)事件A在熱更層和主工程都監(jiān)聽了毫深,那在IOS真機(jī)上吩坝,觸發(fā)完一層的函數(shù)到另外一層時(shí),很可能會(huì)報(bào)nullchek崩潰哑蔫。在熱更Hotfix.dll中钉寝,Component如果注冊(cè)了Update(可能還包含Awake等其他的,沒有測(cè)試)函數(shù)闸迷,則在Update中不要觸發(fā)Hotfix層的事件嵌纲,和第一點(diǎn)類似,在運(yùn)行到new或者Activator.CreateInstance會(huì)報(bào)nullchek崩潰腥沽,無法創(chuàng)建Hotfix內(nèi)部的類逮走。
不要使在熱更層用System.Linq。
有時(shí)候?yàn)榱朔奖闾幚砑辖裱簦昧艘恍㎜inq里的方法师溅,比如First()之類的茅信,但是在ios上iltocpp之后會(huì)拋出一些pc版或者android沒有的異常。
其他的一些還沒遇到的坑會(huì)不定時(shí)更新墓臭。