一、手动起名字打包
1.写插件,在Asset文件夹中创建Editor文件夹,在里面创建插件脚本
2.起名字,给要打包的文件起个AssetBundle名字
3.打包 ,注意要添加 MenuItem特性,还有平台名,因为AssetBundle不跨平台
using System.IO;
using UnityEditor;//引入编辑器的命名空间
using UnityEngine;
public class BuildAB : Editor //继承编辑器的类
{
[MenuItem("MyMenu/BuildAB-Windows")]
public static void BuildAssetBundle()
{
BuildPipeline.BuildAssetBundles(Application.dataPath + "/AB",//打包输出路径
BuildAssetBundleOptions.ChunkBasedCompression,//压缩模式[LZ4]
//BuildAssetBundleOptions.None 默认方式[LZMA],压缩比高,包小,加载比较慢,需要整体解压
//BuildAssetBundleOptions.UncompressedAssetBundle [Uncompressed] 不压缩,包大,加载快
//BuildAssetBundleOptions.ChunkBasedCompression [LZ4]压缩比中等,可以加载指定资源而不用加载全部
BuildTarget.StandaloneWindows64);
}
}
生成的文件:
manifest是说明文件,包含CRC校验码,文件版本号,各文件之间的依赖等。里面内容如下:
二、全自动打包
using System.IO;
using UnityEditor;//引入编辑器的命名空间
using UnityEngine;
public class BuildAB : Editor //继承编辑器的类
{
private static string needBuildAssetsPath = Application.dataPath + "/needBulid";
private static string assetBundleOutPutPath_win = Application.dataPath + "/AB";
[MenuItem("MyMenu/BuildAB-Windows")]
public static void BuildAssetBundle()
{
//清空名字
ClearAssetBundleNames();
//起名字
SetAssetBundleNames();
//打包
BuildPipeline.BuildAssetBundles(assetBundleOutPutPath_win,//打包输出路径
BuildAssetBundleOptions.ChunkBasedCompression,//压缩模式[LZ4]
//BuildAssetBundleOptions.None 默认方式[LZMA],压缩比高,包小,加载比较慢,需要整体解压
//BuildAssetBundleOptions.UncompressedAssetBundle [Uncompressed] 不压缩,包大,加载快
//BuildAssetBundleOptions.ChunkBasedCompression [LZ4]压缩比中等,可以加载指定资源而不用加载全部
BuildTarget.StandaloneWindows64);
//清空名字
ClearAssetBundleNames();
//刷新
AssetDatabase.Refresh();
}
/// <summary>
/// 清空所有的Bundle名称
/// </summary>
private static void ClearAssetBundleNames()
{
var allName = AssetDatabase.GetAllAssetBundleNames();
for (int i = 0; i < allName.Length; i++)
{
AssetDatabase.RemoveAssetBundleName(allName[i], true);//即便正在使用也清除
}
}
private static void SetAssetBundleNames()
{
//需要打包文件的根目录
DirectoryInfo di = new DirectoryInfo(needBuildAssetsPath);
//打开目录
OpenDirectoryAndSetName(di);
//遍历所有子文件夹
/*foreach (var item in di.EnumerateDirectories())
{
Debug.Log(item.FullName);
}*/
//遍历所有meta文件
/*foreach (var item in di.EnumerateFiles())
{
Debug.Log(item.FullName);
}*/
//遍历所有文件和文件夹
/*foreach (var item in di.EnumerateFileSystemInfos())
{
Debug.Log(item.FullName);
}*/
}
private static void OpenDirectoryAndSetName(DirectoryInfo dirInfo)
{
foreach (var item in dirInfo.EnumerateFileSystemInfos())
{
if (item is DirectoryInfo)
{
//递归打开子文件夹
OpenDirectoryAndSetName(item as DirectoryInfo);
}
else
{
if (item.Name.EndsWith(".meta"))
continue;
SetFileBundleName(item.FullName);
}
}
}
/// <summary>
/// 给文件起Bundle名
/// </summary>
/// <param name="fileFullName"></param>
private static void SetFileBundleName(string fileFullName)
{
//获取相对路径
string relativePath = "Assets" + fileFullName.Substring(Application.dataPath.Length);
//获取文件名称[去前缀]
string fileName = fileFullName.Substring(fileFullName.LastIndexOf('\\') + 1);
//去后缀
fileName = fileName.Remove(fileName.LastIndexOf('.'));
//给文件起Bundle名
//获取资源AssetImporter对象
AssetImporter fileImportor = AssetImporter.GetAtPath(relativePath);
fileImportor.assetBundleName = fileName;
}
}