Unity 5.X扩展编辑器之打包assetbundle
2017-09-25 本文已影响27人
小小小小小丶敏
5.x的assetbundle与4.x以及之前的版本有些不同,不过本质是一样的,只不过5.x打包assetbundle更为简单和人性化了,总体来说只需要三个步骤:
//这里是一个资源包数组,其中每一个资源包又可以包含多个小资源,所以一般情况下一个资源包就足够了
AssetBundleBuild[] _ABbuild = new AssetBundleBuild[1];
第二步:给资源命名以及指定需要打包的资源
//资源包的名称
_ABbuild[0].assetBundleName = "打包assetbundle出来之后的文件名";
//资源包下的资源名称,一个资源包可以包含多个资源,资源由从Assets开始的路径组成且包含自身后缀名
string[] _allassetname = new string[3];
_allassetname[0] = "Assets/1.png";
_allassetname[1] = "Assets/2.prefab";
_allassetname[2] = "Assets/3.FBX";
_ABbuild[0].assetNames = _allassetname;
第三步:开始打包
//打包到路径E:/test/mytest
BuildPipeline.BuildAssetBundles("E:/test/mytest", _ABbuild);
将之封装成扩展编辑器之后,把如下脚本放在Editor文件夹内:
using UnityEngine;
using UnityEditor;
using System.Diagnostics;
using System.IO;
public class ExportAssetBundles : EditorWindow
{
[@MenuItem("AssetBundles/Build AssetBundles")]
static void main()
{
EditorWindow.GetWindow<ExportAssetBundles>(false,"AssetBundles");
}
private Vector2 scrollVec2;
private string rootPath = "Assets";
private string _assetBundleName = "";
private string _assetBundlePath = "Assets/StreamingAssets";
private int _assetBundleElementNum = 4;
private string[] _assetBundleElement = new string[4];
void OnGUI()
{
scrollVec2 = EditorGUILayout.BeginScrollView(scrollVec2, GUILayout.Width(position.width), GUILayout.Height(position.height));
EditorGUILayout.BeginHorizontal();
GUILayout.Label("资源包名称:");
_assetBundleName = EditorGUILayout.TextField(_assetBundleName);
if (GUILayout.Button("清空"))
EditorApplication.delayCall += Delete;
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
GUILayout.Label("资源包路径:");
_assetBundlePath = EditorGUILayout.TextField(_assetBundlePath);
if (GUILayout.Button("浏览"))
EditorApplication.delayCall += Save;
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
GUILayout.Label("资源包容量:");
_assetBundleElementNum = EditorGUILayout.IntField(_assetBundleElementNum);
if (GUILayout.Button("增加"))
EditorApplication.delayCall += Add;
EditorGUILayout.EndHorizontal();
if (_assetBundleElementNum > 0)
{
if (_assetBundleElement.Length != _assetBundleElementNum)
{
string[] temp = _assetBundleElement;
_assetBundleElement = new string[_assetBundleElementNum];
for (int i = 0; i < temp.Length; i++)
{
if (i < _assetBundleElement.Length)
_assetBundleElement[i] = temp[i];
}
}
for (int i = 0; i < _assetBundleElementNum; i++)
{
EditorGUILayout.BeginHorizontal();
GUILayout.Label("资源" + (i + 1) + ":");
_assetBundleElement[i] = EditorGUILayout.TextField(_assetBundleElement[i]);
if (GUILayout.Button("浏览"))
Browse(i);
EditorGUILayout.EndHorizontal();
}
}
if (GUILayout.Button("打包"))
{
if (_assetBundleName == "")
{
//打开一个通知栏
this.ShowNotification(new GUIContent("资源包名称不可为空"));
return;
}
if (_assetBundlePath == "C:/" || _assetBundlePath == "D:/" || _assetBundlePath == "E:/" || _assetBundlePath == "F:/")
{
//打开一个通知栏
this.ShowNotification(new GUIContent("资源包路径不可为根目录"));
return;
}
if (_assetBundleElementNum <= 0)
{
//打开一个通知栏
this.ShowNotification(new GUIContent("资源包容量必须大于0"));
return;
}
for (int i = 0; i < _assetBundleElement.Length; i++)
{
if (_assetBundleElement[i] == null || _assetBundleElement[i] == "")
{
//打开一个通知栏
this.ShowNotification(new GUIContent("资源"+(i+1)+"路径为空"));
return;
}
}
EditorApplication.delayCall += Build;
}
EditorGUILayout.EndScrollView();
}
/// <summary>
/// 清空资源包名称
/// </summary>
void Delete()
{
_assetBundleName = "";
//转移焦点至主窗口
EditorUtility.FocusProjectWindow();
}
/// <summary>
/// 选择资源存储路径
/// </summary>
void Save()
{
string path = EditorUtility.OpenFolderPanel("选择要存储的路径", "", "");
if (path.Length != 0)
{
_assetBundlePath = path;
EditorUtility.FocusProjectWindow();
}
}
/// <summary>
/// 资源包容量增加
/// </summary>
void Add()
{
_assetBundleElementNum += 1;
EditorUtility.FocusProjectWindow();
}
/// <summary>
/// 选择单个打包资源
/// </summary>
/// <param name="i">资源序号</param>
void Browse(int i)
{
string path = EditorUtility.OpenFilePanel("选择要打包的资源", @"E:\hutao\Unity Project5.2\Course Cloud Platform\Assets", "*");
if (path.Length != 0)
{
if (path.IndexOf(rootPath) >= 0)
{
//如果选中的资源是dll文件,则自动改后缀名为.bytes
if (path.EndsWith(".dll"))
{
string newpath = path.Substring(0, path.LastIndexOf('.')) + ".bytes";
File.Move(path, newpath);
_assetBundleElement[i] = newpath.Substring(newpath.IndexOf(rootPath));
AssetDatabase.Refresh();
}
else
{
_assetBundleElement[i] = path.Substring(path.IndexOf(rootPath));
}
}
}
}
/// <summary>
/// 打包资源
/// </summary>
void Build()
{
//需要打包的资源(可打包成多个)
AssetBundleBuild[] buildMap = new AssetBundleBuild[1];
//资源包的名称
buildMap[0].assetBundleName = _assetBundleName;
//资源包下的资源名称,一个资源包可以包含多个资源,资源由从Assets开始的路径组成且包含自身后缀名
buildMap[0].assetNames = _assetBundleElement;
BuildPipeline.BuildAssetBundles(_assetBundlePath, buildMap);
}
}
在编辑器中效果图如下:(其中每个资源小项可以是工程中的文件夹,如果是文件夹的话那么该文件夹内所有资源都会打包进去)
文章转自:http://blog.csdn.net/qq992817263/article/details/50730467