动态加载----AssetBundle

89 阅读1分钟

AssetBundle是一个资源的集合,可以是Unity3D所支持的任何资源格式。

一、创建AssetBundle文件

1.从Project选择要打包的资源

2.在Inspector视图底部,选择左边下拉框选择分配AssetBundle,创建AssetBundle,并输入名字,若要添加文件夹,可在名字中用“/”分割。

3.在Asset(Project视口)文件夹下创建Editor文件夹,创建脚本CreateAssetBundles

创建AssetBundle脚本:

using System.IO;
using UnityEditor;
using UnityEngine;
public class CreateAssetBundles : MonoBehaviour
{
    [MenuItem("AB/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        //要创建的目录
        string assetBundleDirectory = "Assets/StreamingAssets/AssetBundles";
        if (!Directory.Exists(assetBundleDirectory))
        { 
            Directory.CreateDirectory(assetBundleDirectory);
        }
        //三个参数:保存位置;压缩方式;创建平台
        BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
    }
}

AssetBundle加载游戏对象脚本----LoadFromFile

public class LoadTest01 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        string path=Application.streamingAssetsPath+"/AssetBundles/resources/"+"sphere";
        AssetBundle assetBundle=AssetBundle.LoadFromFile(path);
        if (assetBundle == null)
        {
            return;
        }
        GameObject obj = assetBundle.LoadAsset<GameObject>("Sphere");
        Instantiate(obj);
    }
}

AssetBundle加载游戏对象脚本----LoadFromMemory()

 using UnityEngine;
 using System.IO;
public class LoadTest02:MonoBehaviour
{
	private void Start()
	{
		string path=Application.dataPath+"/AssetBundles/"+"roles";  //最后一个字符串是AssetBundle的名字
		AssetBundle assetBundle=AssetBundle.LoadFromMemory(File.ReadAllBytes(path));
		if(assetBundle==null)
		{
			return;
		}
		GameObject obj=assetBundle.LoadAsset<GameObject>("Role01"); //字符串是AssetBundle中资源名称
		Instantiate(obj);
	}
}

AssetBundle远程或本地加载游戏对象脚本----UnityWebRequest

using UnityEngine;
using UnityEngine.Networking;
using System.IO;
public class LoadTest03:MonoBehaviour
{
	private void Start()
	{
		StartCoroutine(LoadFromRemote());
	}
  	private IEnumerator LoadFromRemote()
  	{
  		string path="D:/Documents/ABRep/roles";
  		string uri="file:///"+path;  //可将uri换成任何相关的AssetBundle服务器
  		UnityWebRequest reques=UnityWebRequestAssetBundle.GetAssetBundle(uri,0);
  		yield return request.SendWebRequest();
  		AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
  		GameObject obj= bundle.LoadAsset<GameObject>("Role02");
  		Instantiate(obj);
  	}
}