把脚本抽取出来做成dll:
1.打开vs新建项目
2.选择类库,设置目标框架为.NET Framework3.5(根据unity版本来选,4.x版本的选2.0,5.x版本用3.5的),或者项目建成后选择项目,右键点击,选择属性在应用程序那里也可以设置目标框架
3.点击确定打开项目
4.把脚本文件拷贝到项目的目录里,右键点击项目,选择添加现有项,选择刚拷贝的脚本文件,把脚本文件添加到项目里
5.设置相关引用,到unity的安装目录找到UnityEngine.dll,设置为项目引用,解决报错等
6.根据需要设置解决方案配置为Release或Debug,右键点击项目选择生成
7.在项目目录的bin文件夹下即可找到对应生成的dll
dll的加载反射:
1.把dll文件后缀改为bytes(好像是必须是这个后缀的,少了一个s都坑了我半天),打包成AB文件
2.加载AB文件获取Bytes数据
3.反射,获取类实现代码
IEnumerator TestLoadDll()
{
string path = "dllassets/testdll.bytes.unity3d";
if (Application.isEditor || Application.platform == RuntimePlatform.WindowsPlayer)
{
path = "file:///" + Application.dataPath + "/StreamingAssets/" + path;
}
else if (Application.platform == RuntimePlatform.Android)
{
path = Application.streamingAssetsPath + "/" + path;
}
else
{
path = "file:///" + Application.streamingAssetsPath + "/" + path;
}
WWW www= new WWW(path);
yield return www;
if(www.error != null)
{
Debug.LogError("加载出错: " + www.error);
yield break;
}
Object obj = www.assetBundle.LoadAsset("testdll.bytes");
//Assembly ass = Assembly.Load(((TextAsset)obj).bytes);
Assembly ass = System.AppDomain.CurrentDomain.Load(((TextAsset)obj).bytes);
System.Type main = ass.GetType("Main");
GameObject go = GameObject.Find("Main Camera");
go.AddComponent(main);
www.Dispose();
}
实际使用中发现,挂载在资源上的脚本,不是从dll上挂上去的,加载出来的资源是找不到脚本的,只有从dll直接挂到资源上,资源和代码分离后加载的资源才能找到脚本。
参考 https://blog.csdn.net/gz_huangzl/article/details/52486509
解决的办法是,要么把所有挂载在资源上的脚本都换成dll直接挂载,或者把不必要挂载在资源上的脚本分离出来,设计好框架,加载出来的资源都保存对应引用就可以了,没必要所有脚本都挂到资源上,有些必须要挂在资源上的做成dll放在开发工程里也没关系,比如ui框架的相关代码,或者在加载资源那里写逻辑遍历一遍资源骨骼,获取对应的脚本id,查找出来挂上去即可。