Unity 热更新之ILRuntime(二)
一.调用热更新中的静态方法
- 热更新中类的限制
1.一定要带命名空间
2.不要继承MonoBehaviour
private void CallStaticFunc()
{
//=======第一种调用方式=======
//1.无参数
_appDomain.Invoke("Unity.HotFix.Test", "Func", null, null);
//2.一个参数
_appDomain.Invoke("Unity.HotFix.Test", "Func", null, "zzs");
//3.两个参数
_appDomain.Invoke("Unity.HotFix.Test", "Func", null, "zzs","666");
//=======第二种调用方式=======
var type = _appDomain.GetType("Unity.HotFix.Test");
//1.无参数
var method1 = type.GetMethod("Func", 0);
_appDomain.Invoke(method1, null, null);
//2.1个参数
var method2 = type.GetMethod("Func", new List<IType>()
{
_appDomain.GetType(typeof(string))
}, null);
_appDomain.Invoke(method2, null, "zzs");
//3.2个参数
var method3 = type.GetMethod("Func", new List<IType>()
{
_appDomain.GetType(typeof(string)),
_appDomain.GetType(typeof(string))
}, null);
_appDomain.Invoke(method3, null, "zzs","666");
}
二.创建对象实例
private void Instance()
{
//方式一
_appDomain.Instantiate("Unity.HotFix.Test");
_appDomain.Instantiate("Unity.HotFix.Test", new object[]{"zzs"});
//方式二
var type = _appDomain.GetType("Unity.HotFix.Test");
ILTypeInstance inst1 = ((ILType) type).Instantiate();
ILTypeInstance inst2 = ((ILType) type).Instantiate(new object[] {"zzs"});
}
三.调用实例对象的成员方法和变量
不能对字段进行直接获取,只能获取属性值(私有也可以直接获取)
private void CallObject()
{
var type = _appDomain.GetType("Unity.HotFix.Test");
var inst = ((ILType) type).Instantiate(new object[]{18,"zzs"});
var rel = (int)_appDomain.Invoke("Unity.HotFix.Test", "Add", inst, 90, 11);
Debug.Log(rel);
_appDomain.Invoke("Unity.HotFix.Test", "set_Age", inst, 22);
var age = (int)_appDomain.Invoke("Unity.HotFix.Test", "get_Age", inst);
Debug.Log(age);
var myName = (string)_appDomain.Invoke("Unity.HotFix.Test", "get_Name", inst);
Debug.Log(myName);
_appDomain.Invoke("Unity.HotFix.Test", "set_Name", inst, "666");
myName = (string)_appDomain.Invoke("Unity.HotFix.Test", "get_Name", inst);
Debug.Log(myName);
}
四.调用实例对象的泛型方法
private void CallGeneric()
{
var type = _appDomain.GetType("Unity.HotFix.Test");
var inst = ((ILType) type).Instantiate();
_appDomain.InvokeGenericMethod("Unity.HotFix.Test", "TestGeneric", new []
{
_appDomain.GetType(typeof(string))
}, inst,"zzs");
}
五.委托的转换
ILRuntime只能识别Func和Action委托,其余的委托需要进行转换
private void RegisterAction()
{
_appDomain.DelegateManager.RegisterDelegateConvertor<UnityAction>((act) =>
{
return new UnityAction(() =>
{
((Action) act)?.Invoke();
});
});
}
1.例子(实现点击按钮)
private void TestBtn()
{
var type = _appDomain.GetType("Unity.HotFix.Test");
var method = type.GetMethod("AddBtnEvent", 0);
var inst = ((ILType) type).Instantiate();
_appDomain.Invoke(method, inst);
}
public void AddBtnEvent()
{
GameObject.Find("Canvas/Button").GetComponent<Button>().onClick.AddListener(() =>
{
Debug.Log("按钮点击");
});
}
2.拓展
//Action委托注册
_appDomain.DelegateManager.RegisterMethodDelegate<string>();
//Func委托注册
_appDomain.DelegateManager.RegisterFunctionDelegate<string,string,int>();
//Delegate委托注册
_appDomain.DelegateManager.RegisterDelegateConvertor<UnityAction<string>>((act) =>
{
return new UnityAction<string>((str) =>
{
((Action<string>) act).Invoke(str);
});
});