使用反射实现安卓代码热更

把脚本抽取出来做成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,查找出来挂上去即可。

你可能感兴趣的:(使用反射实现安卓代码热更)