使用 ILRuntime UGUI
使用Unity版本為2020.1.17太監版(f1c1),VS為2019(白嫖版community);
1. package manager 里導入ILRuntime。
2. 監聽Button點擊事件。
結果發現宇宙第一IDE VS不提示Button;
這時我們需要,在熱更工程引用里,使用Unity UI的庫文件(UnityEngine.UI.dll);
並且再屬性里設置“復制到本地”選項為“false”。
舊版
Editor\Data\UnityExtensions目錄下。
在新版本Unity中(2019.2之后)
UnityEngine.UI.dll被移動到項目\Library\ScriptAssemblies\UnityEngine.UI.dll (親測:2020.1.17)
3. 寫點代碼
在Unity工程,隨便寫點代碼。用以初始化一下ILRuntime,並調用注冊熱更工程里,注冊監聽的靜態方法。
// Unity工程調用熱更函數
appdomain.Invoke("HotFix_Project.InstanceClass", "RegistBtnClick", null, null);
// 熱更工程注冊Button監聽 // Button位於場景根對象Canvas下
public static void RegistBtnClick()
{
var roots = UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects();
UnityEngine.GameObject btnObject = null;
for (int i = 0; i < roots.Length; i++)
{
if (roots[i].name == "Canvas")
{
btnObject = roots[i].transform.Find("Button").gameObject;
btnObject.GetComponent<Button>().onClick.AddListener(new UnityEngine.Events.UnityAction(() =>
{
UnityEngine.Debug.Log(UnityEngine.Time.frameCount.ToString());
}));
return;
}
}
}
4. 開始運行
首先重新生成熱更工程,然后運行Unity,查看Console窗口。完美運行……個屁。
Console窗口輸出錯誤:KeyNotFoundException: Cannot find convertor for UnityEngine.Events.UnityAction。
並且給出了需要增加的代碼
appdomain.DelegateManager.RegisterDelegateConvertor<UnityEngine.Events.UnityAction>((act) =>
{
return new UnityEngine.Events.UnityAction(() =>
{
((Action<>)act)();
});
});
所以我們使用到的委托類型都需要注冊一下才能使用,代碼說明需要把UnityAction轉換成.NET的Action類型。
5. 再次運行
點擊Button,可以發先Console輸出了當前幀數。
OK。