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);
}
}