項目在開發(fā)時使用的是mono腳本后臺。這樣在技術(shù)選型時選的就是用mono更新dll來熱更新。但其實這也不算一種對玩家友好的更新方式因為在更新是要強制重啟一下梢睛。在工作流方面還有打包時要加密dll,mono內(nèi)要解密dll。項目上線google play。在2019年8月1日后統(tǒng)一強制要求64位狈蚤。mono未提供64位版本只能重新選用IL2CPP腳本后臺。這時候原來的更新流程就廢掉了划纽,選用了Xlua的hotfix脆侮。使用方式按照說明文檔走就可以:開啟ENABLE_HOTFIX,并在打包過程中對dll注入一次勇劣。
注入后的dll變成如下(用.Net Reflector查看):
private static DelegateBridge __Hotfix0_OnGraphStart;
public override void OnGraphStart(Playable playable)
{
DelegateBridge bridge = __Hotfix0_OnGraphStart;
if (bridge != null)
{
bridge.__Gen_Delegate_Imp706(this, playable);
}
else
{
this.inverseDuration = 1f / ((float) playable.GetDuration<Playable>());
}
}
如果沒有xlua.hotfix過靖避,bridge == null走的還是原來的邏輯流程
這里要說下__Gen_Delegate_Imp706這個。這個在生成的文件DelegateGensBridge.cs中的DelegateBridge類的內(nèi)部芭毙。
public void __Gen_Delegate_Imp706(object p0, UnityEngine.Playables.Playable p1)
{
#if THREAD_SAFE || HOTFIX_ENABLE
? ? ? ? ? ? lock (luaEnv.luaEnvLock)
? ? ? ? ? ? {
#endif
? ? ? ? ? ? ? ? // 省略了一些代碼
#if THREAD_SAFE || HOTFIX_ENABLE
? ? ? ? ? ? }
#endif
}
會發(fā)現(xiàn)這個類中有很多的這樣的__Gen_Delegate_Imp*函數(shù)筋蓖。這個是因為OnGraphStart所在的類配置了[XLua.Hotfix]。Xlua會自動收集里面的所有函數(shù)簽名生成對應(yīng)的Delegate退敦。[XLua.Hotfix]建議如下這樣配置
[XLua.Hotfix]
public static List<Type> by_property
{
get
{
return from type in Assembly.Load("Assembly-CSharp").GetTypes()
where type.IsPublic
select type).ToList();
}
}
然后就是使用了:
在LuaEnv.cs文件中定義的xlua.hotfix函數(shù)中如果調(diào)用了
xlua.private_accessible(cs)
就可以在hotfix的函數(shù)中訪問私有字段粘咖、屬性、方法了侈百。如果沒這句也可以自己主動加:
xlua.private_accessible(CS.AnimationSpeedBehaviour) -- 自己加上這句
xlua.hotfix(CS.AnimationSpeedBehaviour,?"OnGraphStart",?function(self,?playable)
-- 邏輯寫在這【self就是這個實例對象】
-- self.private_field
end)
一些經(jīng)驗:
1. 主要調(diào)用時的冒號:和點號.的區(qū)別瓮下。實例對象的成員函數(shù)要用冒號翰铡,靜態(tài)函數(shù)的用點號。
2. 函數(shù)盡量短一些讽坏,不然hotfix寫一遍也很煩惱锭魔。一個函數(shù)只做一件事也更符合代碼規(guī)范。
3. 盡量多的把可能有用的值放到類字段中去路呜,免得以后要去hotfix好幾個函數(shù)取執(zhí)行階段的值迷捧。
4. 留一些備用的類。類的各種成員函數(shù)胀葱,字段(可以用List, Dictionary)也多預(yù)留一些漠秋,開發(fā)新功能時hotfix一下就可以用。
5. 把更多的event設(shè)置LuaCallCSharp抵屿,因為可能以后要增加監(jiān)聽庆锦。
6. 注意執(zhí)行效率,特別是高頻執(zhí)行的函數(shù)轧葛。