unity跨平台及热更新学习笔记-Unity中通过程序域实现DLL的动态加载

1、创建C#类库,并添加对UnityEngine、UnityEngine.UI的引用。

类库结构:

类库逻辑很简单,代码如下:

 1 using System;
 2 using UnityEngine;
 3 using UnityEngine.UI;
 4 
 5 namespace CustomDLL
 6 {
 7     public class CustomClass
 8     {
 9 
10     }
11 
12     public class CustomDLLClass : MonoBehaviour
13     {
14         public Text Text_Res;
15         private int num = 0;
16 
17         void Update()
18         {
19             if (Input.GetKeyDown(KeyCode.A))
20             {
21                 ++num;
22                 Text_Res.text = num.ToString();
23             }
24         }
25     }
26 }

 

生成dll,然后将dll拷贝到unity工程的StreamingAssets目录下:

在unity中添加测试代码:

 1 using System;
 2 using System.Collections;
 3 using System.Reflection;
 4 using UnityEngine;
 5 using UnityEngine.UI;
 6 
 7 public class Test : MonoBehaviour
 8 {
 9     [SerializeField]
10     Text Text_ShowNum;
11 
12     string url;
13 
14     IEnumerator Start()
15     {
16         url = Application.streamingAssetsPath + "/CustonDLL.dll";
17         WWW www = new WWW(url);
18         if (!www.isDone)
19             yield return null;
20 
21         Debug.Log("执行完毕,现在测试如何加载dll");
22         Debug.Log("unity创建的默认程序域 : " + AppDomain.CurrentDomain);
23         //在unity创建的默认程序域上加载dll
24         Assembly assemble = Assembly.Load(www.bytes);
25         var types = assemble.GetTypes();
26         foreach (var item in types)
27         {
28             //显示类所在的命名空间和类名
29             Debug.Log("namespace = " + item.Namespace + "   class =" + item.Name);
30             if (item.IsSubclassOf(typeof(MonoBehaviour)))  //判断类是否继承自MonoBehaviour
31             {
32                 Debug.Log(string.Format("类{0}派生自 MonoBehaviour", item.Name));
33                 //添加组件到当前对象
34                 Component com = gameObject.AddComponent(item);
35                 FieldInfo info = com.GetType().GetField("Text_Res");
36                 if (null != info)
37                 {
38                     Debug.Log("成功获取字段");
39                     info.SetValue(com, Text_ShowNum);
40                 }
41                 else
42                 {
43                     Debug.LogError("获取字段失败");
44                 }
45             }
46             else
47             {
48                 Debug.LogError(string.Format("类{0}并非派生自 MonoBehaviour", item.Name));
49             }
50         }
51     }
52 }

 

注意理解34、35行。

添加Text进行测试:

点击A,会发现Text显示的内容会不断增加:

posted @ 2020-04-25 22:45  小·糊涂仙  阅读(556)  评论(0编辑  收藏  举报