之前都是直接调用静态方法,但是在热更工程内肯定不能全是静态的方法,我们还需要知道如何实例化热更工程里面的类。
修改热更工程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| using UnityEngine;
namespace HotFix { public class TestClass { private int m_Id; public int Id { get { return m_Id; } } public TestClass() { } public TestClass(int id) { m_Id = id;} public static void StaticFuncTest() { Debug.Log("Test"); } public static void StaticFuncTest2(int a) { Debug.Log("Test param a = " + a); } } }
|
第一种实例化方法
第一种方法就是直接在ILRuntime提供的AppDomain里将对应的类实例化出来
修改ILRuntimeManager
的OnHotFixLoaded
方法
1 2 3 4 5 6 7 8 9 10 11 12 13
| void OnHotFixLoaded() { IType type = m_AppDomain.LoadedTypes["HotFix.TestClass"];
object obj1 = m_AppDomain.Instantiate("HotFix.TestClass",new object[] {15});
int id1 = (int)m_AppDomain.Invoke("HotFix.TestClass", "get_Id", obj1, null);
Debug.Log(id1);
}
|
这里可以看到m_AppDomain.Invoke
里面的第三个参数就是实例化的类对象,如果我们调用的方法不是静态的,就必须传入这个对象。
第二种实例化的方法
我们已经通过IType type = m_AppDomain.LoadedTypes["HotFix.TestClass"];
得到了目标类,可以直接通过它实例化这个类
1 2 3 4 5 6 7 8 9 10 11 12 13
| void OnHotFixLoaded() { IType type = m_AppDomain.LoadedTypes["HotFix.TestClass"];
object obj2 = ((ILType)type).Instantiate(new object[] {12});
int id1 = (int)m_AppDomain.Invoke("HotFix.TestClass", "get_Id", obj1, null);
Debug.Log(id1);
}
|