《搬砖日记》AssetsBundle实现资源更新及通过反射添加脚本

该随笔分两部分,第一部分 AssetsBundle实现游戏物体和代码的打包,第二部分游戏物体和代码的加载及通过反射添加脚本

一. AssetsBundle打包

1.在Assets中新建文件夹Editor,并在Editor中新建C#脚本,编写以下内容,

using UnityEditor;
using System.IO;

public class CreatAssetsBundle
{
    [MenuItem("AssetsBundle/Build AssetBundles")]
    static void BuildAllAssetBundles()//进行打包
    {
        string dir = "AssetBundles";
        //判断该目录是否存在
        if (Directory.Exists(dir) == false)
        {
            Directory.CreateDirectory(dir);//在工程下创建AssetBundles目录
        }
        //参数一为打包到哪个路径,参数二压缩选项  参数三 平台的目标
        BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
    }
}

此时Unity菜单栏中会多出

2.打开VS新建类库(我使用的是VS2015),注意使用 .NEt Framework3.5 高版本的Unity不支持

在项目中新建CubeTest.CS文件,将测试脚本内容编写进去

 

  此时会发现有报错,是因为我们没有添加Unity类库的引用,右键引用为工程添加UnityEngine.dll引用,UnityEngine.dll引用在安装目录下的  /Unity/Editor/Data/Manager/UnityEngine.dll

 

然后生成解决方案,在输出栏中可以看到生成的解决方案的所在路径

我们将生成的.dll文件后缀名改为.bytes并将文件放入Unity项目中

3.项目中新建Cube并将Cube变成预制体,通过New 修改红框中的内容

修改ABTest.bytes,注意要和Cube预制体的一样

4.点击菜单栏中AssetsBundle/Build AssetBundles,这时会在 AssetBundles 文件夹中生成我们自己定义的assetbundle文件,其中 cubeab.ab是我们的资源文件, cubeab.ab.manifest文件是我们的配置文件,用记事本打开cubeab.ab .manifest文件,可以看到我们打包的预制体

到此为止预制体和代码的打包就完成了

二. AssetsBundle加载及通过反射添加脚本

1.将步骤一生成的 cubeab.ab和cubeab.ab.manifest文件放入本地服务器

2.新建Unity工程在空物体上添加 LoadAssetbundles.cs 脚本

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
using System.Reflection;
using System;
using System.IO;
using System.Net;

public class LoadAssetbundles : MonoBehaviour
{
    IEnumerator Start()
    {
        //本地服务器assetbundle文件存放路径
        string path = "http://localhost/AssetBundle/cubeab.ab";
        //通过WWW加载assetbundle文件,1代表版本号
        WWW www = WWW.LoadFromCacheOrDownload(path, 1);
        yield return www;
        //取得www中的assetBundle
        AssetBundle ab = www.assetBundle;
        //将.bytes文件转化为TextAsset
        TextAsset text = ab.LoadAsset("ABTest.bytes", typeof(TextAsset)) as TextAsset;
        //转化为byte数组
        byte[] by = text.bytes;
        //通过反射获取CubeTest类
        Assembly am = Assembly.Load(by);
        Type type = am.GetType("CubeTest");
        //将assetBundle中的物体加载出来放入数组中
        GameObject[] obj = ab.LoadAllAssets<GameObject>();
        //在场景中生成assetBundle中的物体
        foreach (GameObject o in obj)
        {
            Instantiate(o);
        }
        //给生成的游戏物体添加 CubeTest脚本
        GameObject.Find("Cube(Clone)").AddComponent(type);
    }
   

}

3.运行Unity

原文地址:https://www.cnblogs.com/YorkZhao/p/10064163.html