1.需要创建一个.NET Framework 3.5 类库
2.在解决方案资源管理器中添加引用Unity3个Dll文件
UnityEngine
UnityEngine.CoreModule
UnityEngine.UI
3.在类中引用UnityEngine和 UnityEngine.UI类继承MonoBehaviour就能正常编写程序了
4.编写完程序点击生成然后生成解决方案
5.找到生成的Dll文件在解决方案资源管理器中右键项目选择在文件资源管理器中打开文件夹然后选择bin文件夹然后是Debug找到dll
6.打开Unity把刚才的dll文件导入并且修改后缀名为bytes打成AssetBundle包
转载AssetBundle教程
AssetBundle打包工具
7.通过加载ab包将资源转换为文本文件然后转换成byte数组在反射成组件挂载到物体上去就可以实现热更新了
/*****************************************************
文件:TestDlll.cs
版本:01
作者:GZL
功能:测试加载dll热更新
*****************************************************/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
using UnityEngine.UI;
public class TestDll : MonoBehaviour
{
public Text text_1;
public TextAsset loadABTextFile;
void Awake()
{
text_1.text = Application.streamingAssetsPath + "/Dll/dlltest.ab";
LoadDllAB(text_1.text, "DllTest");//ab包路径 dll工程名
AddMyComponent("DllTest.Class1", this.gameObject); //dll工程名.类名 要将这个组件挂载的物体
}
void LoadDllAB(string path, string dllName)
{
AssetBundle ab = AssetBundle.LoadFromFile(path);//加载本地AB包内容
loadABTextFile = ab.LoadAsset(dllName, typeof(TextAsset)) as TextAsset;
}
void AddMyComponent(string className, GameObject Modes)
{
byte[] by = loadABTextFile.bytes;
Assembly am = Assembly.Load(by);
Type type = am.GetType(className);
Modes.AddComponent(type);
}
}
8.一切准备就绪后运行就会发现指定物体上挂载了指定的组件后续修改的换去类库修改逻辑后在重复上面的操作替换ab包就行了
这里还是建议用lua做热更新,这个只是学习探索,而且性能比较慢因为用的是反射,而且后面要在去操作这个动态挂的组件都要写成反射的方式,而且一套操作比较繁琐