http://blog.csdn.net/qq_18995513/article/details/51955609 这个链接是assetdatabase的链接。仅仅用于编辑器。配合着assetbundle使用
没有接触过assetbundle的人来说是比较困难的。首先是打包。(注意批量在右下角bundlename赋值,否则将不会打包,)。 注意依赖项不用给名字他会自动打包进prefab。后面代码可以做参考,格外注意5.3的加载只需要加载prefab,依赖项自动加载不需要再给bundlename,否则反而会丢失材质。
在Editor下脚本如下:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEditor;
public class BuildBundle {
/// <summary>
/// 根据当前buildSetting的平台进行不同平台的assetbundle打包
/// </summary>
[MenuItem("BuildBundle/Build Asset Bundles")]
static void BuildAssetBundle()
{
if (!System.IO.Directory.Exists("AssetBundles/" + EditorUserBuildSettings.activeBuildTarget.ToString()))
{
System.IO.Directory.CreateDirectory("AssetBundles/" + EditorUserBuildSettings.activeBuildTarget.ToString());
}
BuildPipeline.BuildAssetBundles("AssetBundles/" + EditorUserBuildSettings.activeBuildTarget.ToString(), BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget);
}
}
[MenuItem("Assets/Get AssetBundle names")]
//抓取所有新建的name。无论设置与否。
static void GetNames()
{
var names = AssetDatabase.GetAllAssetBundleNames();
foreach (var name in names)
Debug.Log("AssetBundle: " + name);
}
}
然后是加载:
其中第一个 single加载的没有加载依赖项
第二种模式加载了依赖项。显示正常
总结: 在实例化之前,一定要把所有的依赖项加载出来,否则出现丢失材质或者贴图或者别的。
对比下new 和loadcace的优劣
(1)前者的优势
- 后续的Load操作在内存中进行,相比后者的IO操作开销更小;
- 不形成缓存文件,而后者则需要额外的磁盘空间存放缓存;
- 能通过http://WWW.texture,http://WWW.bytes,http://WWW.audioClip等接口直接加载外部资源,而后者只能用于加载AssetBundle
(2)前者的劣势
- 每次加载都涉及到解压操作,而后者在第二次加载时就省去了解压的开销;
- 在内存中会有较大的WebStream,而后者在内存中只有通常较小的SerializedFile。(此项为一般情况,但并不绝对,对于序列化信息较多的Prefab,很可能出现SerializedFile比WebStream更大的情况)
using UnityEngine;
using System.Collections;
public enum eMode
{
Single,
MainFest,
}
public class LoadAssetBundles : MonoBehaviour
{
public string url;//单个加载 在面板中设置
public string url1 ;//主Mainfest加载。 在面板中已经设置。
string url_ = "file://D:/allproject/assetbundle01/Assets/TestBundle/";//当前bundle文件夹路径。 注意路径 windows这点比较坑。
GameObject cube;
eMode mode = eMode.MainFest;
// Use this for initialization
void Start()
{
ResourcesLoad("cube");
}
public void ResourcesLoad( string gamename) {
StartCoroutine(LoadAssetBundle(gamename));
}
IEnumerator LoadAssetBundle(string objName )
{
Debug.Log(mode);
if (mode == eMode.Single) //单个加载。会丢失材质。 需要在克隆之前load下依赖项(不用克隆出来)。
{
WWW www = new WWW(url);
yield return www;
if (www.error != null)
{
Debug.Log("www is wrong");
}
else
{
AssetBundle assetbundle = www.assetBundle;
cube = Instantiate(assetbundle.LoadAsset(objName)) as GameObject;
assetbundle.Unload(false);
www.Dispose();
}
}
else
{
WWW mwww = WWW.LoadFromCacheOrDownload(url1, 0); //加载Bundle文件并获取WWW对象,同时将解压形式的Bundle内容存入磁盘中作为缓存(如果该Bundle已在缓存中,则省去这一步)
yield return mwww;
if (!string.IsNullOrEmpty(mwww.error))
{
Debug.Log(mwww.error);
}
else
{
AssetBundle mab = mwww.assetBundle; //获取bundle对象
AssetBundleManifest mainfest = (AssetBundleManifest)mab.LoadAsset("AssetBundleManifest");// 抓到主Mainfest,固定写法。
mab.Unload(false);
string[] dps = mainfest.GetAllDependencies(objName);
AssetBundle[] abs = new AssetBundle[dps.Length];
Debug.Log(dps.Length);
for (int i = 0; i < dps.Length; i++)
{
string dUrl = "file://D:/allproject/assetbundle01/Assets/TestBundle/" + dps[i];
WWW dwww = WWW.LoadFromCacheOrDownload(dUrl, mainfest.GetAssetBundleHash(dps[i]));
yield return dwww;
abs[i] = dwww.assetBundle; //在实例化前获取所有bundle。
Debug.Log(dps[i]);
dwww.Dispose();
dwww = null;
}
WWW www = WWW.LoadFromCacheOrDownload(url, 0);
yield return www;
if (!string.IsNullOrEmpty(www.error))
{
Debug.Log(www.error);
}
else
{
AssetBundle ab = www.assetBundle;
GameObject gobj = ab.LoadAsset(objName) as GameObject; // 真正加载资源。
if (gobj != null)
Instantiate(gobj);
ab.Unload(false);
}
foreach (AssetBundle ab in abs)
{
ab.Unload(false); // 删除ab但是不是删除相关资源给false。
}
www.Dispose();
www = null;
}
mwww.Dispose();
mwww = null;
}
yield return null;
}
}