之前都是直接调用静态方法,但是在热更工程内肯定不能全是静态的方法,我们还需要知道如何实例化热更工程里面的类。

修改热更工程

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里将对应的类实例化出来

修改ILRuntimeManagerOnHotFixLoaded方法

1
2
3
4
5
6
7
8
9
10
11
12
13
void OnHotFixLoaded()
{
//从ILRuntime中获取到类型,更方便进行方法调用
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);//在C#里面的属性相当于方法

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()
{
//从ILRuntime中获取到类型,更方便进行方法调用
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);//在C#里面的属性相当于方法

Debug.Log(id1);

}