原文链接 http://blog.csdn.net/dingxiaowei2013/article/details/17439887
using UnityEngine; using System.Collections; using System.IO; using UnityEditor; public class AssetBunldesEditor : Editor { //打包单个 [MenuItem("Custom/Create AssetBunldes")] static void CreateAssetBunldes () { //获取在Project视图中选择的所有游戏对象 Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets); string streamingPath = Application.dataPath + "/StreamingAssets"; if (!Directory.Exists(streamingPath)) Directory.CreateDirectory(streamingPath); //遍历所有的游戏对象 foreach (Object obj in SelectedAsset) { //本地测试:建议最后将Assetbundle放在StreamingAssets文件夹下,如果没有就创建一个,因为移动平台下只能读取这个路径 //StreamingAssets是只读路径,不能写入 //服务器下载:就不需要放在这里,服务器上客户端用www类进行下载。 string targetPath = Application.dataPath + "/StreamingAssets/" + obj.name + ".assetbundle"; if (BuildPipeline.BuildAssetBundle (obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies)) { Debug.Log(obj.name +"资源打包成功"); } else { Debug.Log(obj.name +"资源打包失败"); } } //刷新编辑器 AssetDatabase.Refresh (); } //多个资源打成一个包 [MenuItem("Custom/Create AssetBunldes ALL")] static void CreateAssetBunldesALL () { Caching.CleanCache (); string Path = Application.dataPath + "/StreamingAssets/ALL.assetbundle"; Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets); foreach (Object obj in SelectedAsset) { Debug.Log ("Create AssetBunldes name :" + obj); } //这里注意第二个参数就行 if (BuildPipeline.BuildAssetBundle (null, SelectedAsset, Path, BuildAssetBundleOptions.CollectDependencies)) { AssetDatabase.Refresh (); } else { } } }手动新建一个目录Assets/StreamingAssets 并把AssetBunldesEditor.cs放在Assets/Editor/下面
//打包资源时通常使用下面项
//包含所有依赖关系 | 强制包括整个资源 | 确保生成唯一ID(打包依赖时会有用)
BuildAssetBundleOptions options = BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets | BuildAssetBundleOptions.DeterministicAssetBundle;
示例:在编辑器中导出模型与加载模型
using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEditor; /// <summary> /// 资源工具 /// </summary> public class AssetToolEditor { [MenuItem("Assets/Tool/导出选中模型")] public static void MenuExportModel() { Object obj = Selection.activeObject; string asset_path = AssetDatabase.GetAssetPath(obj); string export_folder = Application.streamingAssetsPath + "/model"; if (!Directory.Exists(export_folder)) { Directory.CreateDirectory(export_folder); AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate); } Debug.Log(export_folder); string[] assetNames = AssetDatabase.GetDependencies(asset_path); BuildAssetBundleOptions options = BuildAssetBundleOptions.ChunkBasedCompression; AssetBundleBuild abb = new AssetBundleBuild(); abb.assetBundleName = obj.name; abb.assetBundleVariant = "model"; abb.assetNames = assetNames; BuildPipeline.BuildAssetBundles(export_folder, new AssetBundleBuild[] { abb }, options, EditorUserBuildSettings.activeBuildTarget); AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate); //删除生成的manifest文件 export_folder = export_folder.Substring(export_folder.LastIndexOf("/Assets/") + 1); AssetDatabase.DeleteAsset(string.Format("{0}/{1}.{2}.manifest", export_folder, abb.assetBundleName.ToLower(), abb.assetBundleVariant)); string folder_name = export_folder.Substring(export_folder.LastIndexOf("/") + 1); AssetDatabase.DeleteAsset(string.Format("{0}/{1}.manifest", export_folder, folder_name)); AssetDatabase.DeleteAsset(string.Format("{0}/{1}", export_folder, folder_name)); AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate); } [MenuItem("Assets/Tool/加载导出模型")] public static void LoadExportModel() { Object obj = Selection.activeObject; string asset_path = AssetDatabase.GetAssetPath(obj); string url = string.Format("{0}/{1}", Application.dataPath.Replace("/Assets", ""), asset_path); Debug.Log(url); //释放掉之前加载的 AssetBundle.UnloadAllAssetBundles(true); AssetBundle ab = AssetBundle.LoadFromFile(url); Debug.Log(ab); if (ab == null) { Debug.LogErrorFormat("ab=null"); return; } GameObject model = null; Object[] objs = ab.LoadAllAssets(); for (int i = 0; i < objs.Length; i++) { if (objs[i] is GameObject) { if (objs[i].name.ToLower() == obj.name.ToLower()) { model = objs[i] as GameObject; } } //Debug.Log(objs[i]); } if (model == null) return; GameObject.Instantiate(model); } }