使用版本
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沒有的異常。
其他的一些還沒遇到的坑會不定時更新。