AssetBundle资源打包

unity5.x AssetBundle 资源打包方法(在工程目录下创建一个ASB文件夹):

using UnityEngine;
using UnityEditor;
using System.IO;
using System.Collections.Generic;

public class BASB
{
	
	[@MenuItem("Asset/Build AssetBundles")]
	public static void ExportAssetBundles6 ()
	{
		ExportAssetBundles5();
	}


	public static bool ExportAssetBundles5 (string assetBundleName = "a" ,
	                                        string assetBundleVariant = "unity3d" ,
	                                        string assetPath = "/ASB" ,
	                                        BuildAssetBundleOptions basbOptions  = BuildAssetBundleOptions.CollectDependencies,
	                                        BuildTarget bTarget = BuildTarget.StandaloneWindows)
	{
		//获取在Project视图中选择的所有游戏对象
		Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets);
		int length = SelectedAsset.Length;
		if(length == 0)
		{
			Debug.LogWarning("none asset is selected");
			return false;
		}
		string[] assetNames = new string[length];
		for(int i = 0 ; i < length ; i ++)
		{
			assetNames[i] =  AssetDatabase.GetAssetPath (SelectedAsset[i]);
		}
		AssetBundleBuild[] abbs = new AssetBundleBuild[1];
		AssetBundleBuild sbb = new AssetBundleBuild();
		sbb.assetBundleName = assetBundleName;
		sbb.assetBundleVariant = assetBundleVariant;
//		sbb.assetNames = assetNames;
		sbb.assetNames = AssetDatabase.GetDependencies(assetNames);
		abbs[0] = sbb;
//		string path = Application.dataPath + "/ASB";
		assetPath = Application.dataPath + assetPath;
		AssetBundleManifest amf  = BuildPipeline.BuildAssetBundles(assetPath , abbs ,basbOptions , bTarget);
		if(amf != null)
		{
			Debug.Log("create asb succeed ! file path : " + assetPath);
		}
		//刷新编辑器
		AssetDatabase.Refresh ();	

		return amf != null;
	}

//	[@MenuItem("Asset/Build AssetBundles From Directory of Files - single")]
//	static void ExportAssetBundles ()
//	{
//		// Get the selected directory
//		//获取选择的目录
//		string path = AssetDatabase.GetAssetPath (Selection.activeObject);
//		Debug.Log ("Selected Folder: " + path);
//		if (path.Length == 0) {
//			return;
//		}
//		path = path.Replace ("Assets/", "");
//		string [] fileEntries = Directory.GetFiles (Application.dataPath + "/" + path);
//		foreach (string fileName in fileEntries) {
//			if(fileName.Contains(".meta"))
//			{
//				continue;
//			}
//			string filePath = fileName.Replace ("\\", "/");
//			int index = filePath.LastIndexOf ("/");
//			filePath = filePath.Substring (index);
//			string localPath = "Assets/" + path;
//			if (index > 0)
//				localPath += filePath;
//			Object t = AssetDatabase.LoadMainAssetAtPath (localPath);
//			if (t != null) {
//				Debug.Log ("resName: "+t.name);
//				string bundlePath = "Assets/" + path + "/" + t.name + ".unity3d";
//				Debug.Log ("Building bundle at: " + bundlePath);
//				// Build the resource file from the active selection.
//				//从激活的选择编译资源文件
//				bool isSucc = BuildPipeline.BuildAssetBundle (t, null, bundlePath, basbOptions , bTarget);
//				Debug.Log("isSucc : " + isSucc);
//			}
//		}
//		// 刷新编辑器
//		AssetDatabase.Refresh ();
//	}
//	[@MenuItem("Asset/Build AssetBundles From Directory of Files - all")]
//	static void ExportAssetBundles2 ()
//	{
//		// Get the selected directory
//		//获取选择的目录
//		string path = AssetDatabase.GetAssetPath (Selection.activeObject);
//		Debug.Log ("Selected Folder: " + path);
//		if (path.Length == 0) {
//			return;
//		}
//		path = path.Replace ("Assets/", "");
//		string bundlePath = Application.dataPath + "/" + path;
//		string [] fileEntries = Directory.GetFiles (bundlePath);
//		List<Object> objs = new List<Object>();
//		foreach (string fileName in fileEntries) {
//			if(fileName.Contains(".meta"))
//			{
//				continue;
//			}
//			string filePath = fileName.Replace ("\\", "/");
//			int index = filePath.LastIndexOf ("/");
//			filePath = filePath.Substring (index);
//			string localPath = "Assets/" + path;
//			if (index > 0)
//				localPath += filePath;
//			Object t = AssetDatabase.LoadMainAssetAtPath (localPath);
//			if (t != null) {
//				objs.Add(t);
//				Debug.Log ("resName: "+t.name);
//			}
//		}
//		if(objs.Count == 0) return;
//		string[] filePNames = path.Split('/');
//		bundlePath += ("/" + filePNames[filePNames.Length - 1] + ".unity3d");
//		Debug.Log ("Building bundle at: " + bundlePath);
//		bool isSucc = BuildPipeline.BuildAssetBundle (null, objs.ToArray(), bundlePath, basbOptions , bTarget);
//		Debug.Log("isSucc : " + isSucc);
//		// 刷新编辑器
//		AssetDatabase.Refresh ();
//	}
//	[@MenuItem("Asset/Build AssetBundles From Selected of Files - single")]
//	static void ExportAssetBundles3 ()
//	{
//		//获取在Project视图中选择的所有游戏对象
//		Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets);
//				//遍历所有的游戏对象
//		foreach (Object obj in SelectedAsset) 
//		{
//			string sourcePath = AssetDatabase.GetAssetPath (obj);
//			//本地测试:建议最后将Assetbundle放在StreamingAssets文件夹下,如果没有就创建一个,因为移动平台下只能读取这个路径
//			//StreamingAssets是只读路径,不能写入
//			//服务器下载:就不需要放在这里,服务器上客户端用www类进行下载。
//			string targetPath = Application.dataPath + "/StreamingAssets/" + obj.name + ".assetbundle";
//			bool isSucc = BuildPipeline.BuildAssetBundle (obj, null, targetPath, basbOptions  , bTarget);
//			Debug.Log("isSucc : " + isSucc);
//		}
//		//刷新编辑器
//		AssetDatabase.Refresh ();	
//	}
//	[@MenuItem("Asset/Build AssetBundles From Selected of Files - all")]
//	static void ExportAssetBundles4 ()
//	{
//		//获取在Project视图中选择的所有游戏对象
//		Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets);
//
//		string path = Application.dataPath + "/StreamingAssets/" + "asb.assetbundle";
//		//打包资源
//		bool isSucc = BuildPipeline.BuildAssetBundle(null, SelectedAsset, path, basbOptions, bTarget);
//
//		Debug.Log("isSucc : " + isSucc);
//		//刷新编辑器
//		AssetDatabase.Refresh ();	
//	}


}



也可使用创建AssetBundle资源包的编辑器窗口

using UnityEngine;
using UnityEditor;
public class MyEditor : EditorWindow 
{
	
	[MenuItem ("Custom/Build AssetBundles Window")]
	static void AddWindow ()
	{       
		//创建窗口
		Rect  wr = new Rect (0,0,640,640);
		MyEditor window = (MyEditor)EditorWindow.GetWindowWithRect (typeof (MyEditor),wr,true,"window");	
		window.Show();
		
	}

	string[] names = new string[3]{"a" , "unity3d" , "/ASB"};
	BuildAssetBundleOptions[] babos = new BuildAssetBundleOptions[]{
		BuildAssetBundleOptions.None,
		BuildAssetBundleOptions.UncompressedAssetBundle,
		BuildAssetBundleOptions.CollectDependencies,
		BuildAssetBundleOptions.CompleteAssets ,
		BuildAssetBundleOptions.DisableWriteTypeTree ,
		BuildAssetBundleOptions.DeterministicAssetBundle ,
		BuildAssetBundleOptions.ForceRebuildAssetBundle ,
		BuildAssetBundleOptions.IgnoreTypeTreeChanges ,
		BuildAssetBundleOptions.AppendHashToAssetBundleName 

	}; 
	bool[] buildAssetBundleOptions = new bool[9];
	BuildTarget[] buildTargets = new BuildTarget[]{BuildTarget.iOS , BuildTarget.Android , BuildTarget.StandaloneWindows};
	int buildTarget = 2;

	
	public void Awake () 
	{
		
	}
	//绘制窗口时调用
	void OnGUI () 
	{
		GUILayout.Space(20);
		//输入框控件
		names[0] = EditorGUILayout.TextField("assetBundleName:",names[0]);
		names[1] = EditorGUILayout.TextField("assetBundleVariant:",names[1]);
		names[2] = EditorGUILayout.TextField("assetPath:",names[2]);

		GUILayout.Space(50);
//		GUILayout.BeginArea(new Rect(50,100 , 500,400));
			GUILayout.Button("buildAssetBundleOptions" , GUILayout.Width(200));
			for(int i = 0 ; i < buildAssetBundleOptions.Length ; i ++)
			{
				buildAssetBundleOptions[i] = GUILayout.Toggle(buildAssetBundleOptions[i] , babos[i].ToString());
			}
//		GUILayout.EndArea();

		GUILayout.Space(50);
//		GUILayout.BeginArea(new Rect(50,300 , 500,400));
			GUILayout.Button("build target", GUILayout.Width(200));
			buildTarget = GUILayout.Toolbar(buildTarget , new string[]{"ios" , "android" , "window"});
//		GUILayout.EndArea();
	
		GUILayout.BeginArea(new Rect(160,560,350,100));
		GUILayout.BeginHorizontal();
		if(GUILayout.Button("关闭窗口",GUILayout.Width(150) , GUILayout.Height(50)))
		{
			//关闭窗口
			this.Close();
		}
		if(GUILayout.Button("创建资源包",GUILayout.Width(150) , GUILayout.Height(50)))
		{

			BuildAssetBundleOptions bbo = BuildAssetBundleOptions.None;

			for(int i = 0 ; i < buildAssetBundleOptions.Length ; i ++)
			{
				if(buildAssetBundleOptions[i])
				{
					if(bbo != BuildAssetBundleOptions.None)
					{
						bbo = bbo | babos[i];
					}
					else{
						bbo = babos[i];
					}
				}
			}
//			Debug.Log("bbo = " + bbo);
			bool isSucc = BASB.ExportAssetBundles5(names[0],names[1],names[2],bbo ,buildTargets[buildTarget]);

			this.ShowNotification(new GUIContent(isSucc ? "创建成功" : "创建失败"));
		}
		GUILayout.EndArea();
	}
	
	//更新
	void Update()
	{
		
	}
//	void OnFocus()
//	{
//		Debug.Log("当窗口获得焦点时调用一次");
//	}
//	
//	void OnLostFocus()
//	{
//		Debug.Log("当窗口丢失焦点时调用一次");
//	}
//	
//	void OnHierarchyChange()
//	{
//		Debug.Log("当Hierarchy视图中的任何对象发生改变时调用一次");
//	}
//	
//	void OnProjectChange()
//	{
//		Debug.Log("当Project视图中的资源发生改变时调用一次");
//	}
	void OnInspectorUpdate()
	{
		//Debug.Log("窗口面板的更新");
		//这里开启窗口的重绘,不然窗口信息不会刷新
		this.Repaint();
	}
	
	void OnSelectionChange()
	{
		//当窗口出去开启状态,并且在Hierarchy视图中选择某游戏对象时调用
//		foreach(Transform t in Selection.transforms)
//		{
//			//有可能是多选,这里开启一个循环打印选中游戏对象的名称
//			Debug.Log("OnSelectionChange" + t.name);
//		}
	}
//	void OnDestroy()
//	{
//		Debug.Log("当窗口关闭时调用");
//	}
}


如图



猜你喜欢

转载自blog.csdn.net/fucun1984686003/article/details/51683035