使用 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。